H2数据库和CTE(递归查询)

时间:2015-08-09 11:39:20

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

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

从H2控制台查询工作就像一个魅力,但不是从应用程序调用它(它没有返回记录,虽然他们在那里,我可以从H2控制台看到使用相同的查询Hibernate打印在Java控制台中。)

我首先尝试在存储库中注释本机查询,现在我尝试从自定义存储库运行它。没有用。

这是我的自定义存储库:

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保存数据(以确保数据保存在同一个数据库实例中),结果总是相同的,无论我做什么。

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

非常感谢任何帮助。

谢谢, 圣保罗

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

我会建议3个动作。

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

2-打开sql logger以检查代码生成的查询,并仔细检查两个参数的值。

3-我建议将此CTE作为准备好的声明,并使用标准的jdbc方式。