【问题标题】:H2 Database and CTE (recursive query)H2 数据库和 CTE(递归查询)
【发布时间】:2015-11-01 10:31:25
【问题描述】:

我正在使用内存 H2 数据库进行测试。我的应用程序是 Spring Boot,从应用程序运行 CTE(递归查询)时遇到问题。

从 H2 控制台查询就像一个魅力,但不是从应用程序调用它时(它不返回任何记录,虽然它们在那里,我可以从 H2 控制台看到使用与 Java 控制台中 Hibernate 打印的完全相同的查询) .

我最初尝试在存储库中注释本机查询,现在我尝试从自定义存储库运行它。没有任何作用。

这是我的自定义存储库:

public class RouteRepositoryImpl implements CustomRouteRepository{

    @PersistenceContext
    private EntityManager entityManager;

    @SuppressWarnings("unchecked")
    @Override
    public List<Route> findPossibleRoutesByRouteFrom(String name, String routeFrom) {
        StringBuffer sb = new StringBuffer();
        sb.append("WITH LINK(ID ,ROUTE_FROM ,ROUTE_TO,DISTANCE, LOGISTICS_NETWORK_ID ) AS ");
        sb.append("(SELECT ID , ROUTE_FROM ,ROUTE_TO, DISTANCE, LOGISTICS_NETWORK_ID FROM ROUTE WHERE ROUTE_FROM=:routeFrom ");
        sb.append("UNION ALL ");
        sb.append("SELECT ROUTE.ID , ROUTE.ROUTE_FROM , ROUTE.ROUTE_TO, ROUTE.DISTANCE, ROUTE.LOGISTICS_NETWORK_ID ");
        sb.append("FROM LINK INNER JOIN ROUTE ON LINK.ROUTE_TO = ROUTE.ROUTE_FROM) ");
        sb.append("SELECT DISTINCT L.ID, L.ROUTE_FROM, L.ROUTE_TO, L.DISTANCE, L.LOGISTICS_NETWORK_ID ");
        sb.append("FROM LINK L WHERE LOGISTICS_NETWORK_ID = (SELECT L.ID FROM LOGISTICS_NETWORK L WHERE L.NAME=:name) ");
        sb.append("ORDER BY ROUTE_FROM, ROUTE_TO ");
        Query query= entityManager.createNativeQuery(sb.toString(), Route.class);
        query.setParameter("routeFrom", routeFrom);
        query.setParameter("name", name);
        List<Route> list = query.getResultList();
        return list;
    }
}

参数不是问题,因为我将它们硬编码到查询中进行测试。

在每次测试之前使用 RunScript.execute 将数据加载到数据库中,并在测试完成后立即截断。

我还尝试在测试中使用常规 repositor.save 保存数据(以确保数据保存在同一个数据库实例中)并且无论我做什么,结果总是相同的。

这个应用程序是作为面试前的测试而构建的,因此我已经迟到了。

非常感谢任何帮助。

谢谢, 保罗

【问题讨论】:

    标签: hibernate spring-boot spring-data h2 common-table-expression


    【解决方案1】:

    我建议采取 3 项行动。

    1- 如果有任何错误,请查看 H2 跟踪。

    2- 打开 sql 记录器以检查代码生成的查询并仔细检查用于两个参数的值。

    3- 我建议将此 CTE 设为准备好的语句,并以标准 jdbc 方式使用它。

    【讨论】:

    • 感谢 Christian,我已经完成了 1 和 2,将研究 #3。谢谢。
    【解决方案2】:

    H2 只支持没有命名参数的递归 CTE。

    猜你喜欢
    • 2014-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-25
    • 1970-01-01
    • 2016-09-28
    • 2014-03-29
    • 2014-08-11
    相关资源
    最近更新 更多