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

Hibernate H2数据库和CTE(递归查询),hibernate,spring-boot,spring-data,h2,common-table-expression,Hibernate,Spring Boot,Spring Data,H2,Common Table Expression,我正在使用内存H2数据库进行测试。我的应用程序是Spring Boot,从应用程序运行CTE递归查询时遇到问题 从H2控制台,查询就像一个符咒一样工作,但当从应用程序调用它时,它不会返回任何记录,尽管它们在那里,但我可以从H2控制台看到,在Java控制台中使用与Hibernate打印相同的查询 起初我尝试在存储库中注释本机查询,现在我尝试从自定义存储库中运行它。都不管用 这是我的自定义存储库: public class RouteRepositoryImpl implements CustomR

我正在使用内存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在每次测试之前将数据加载到数据库中,并在测试完成后立即截断数据

我还尝试在测试中使用regular repositor.save保存数据,以确保数据保存在同一数据库实例中,并且无论我做什么,结果始终相同

这个应用程序是作为面试前的测试而开发的,我已经为此迟到了

非常感谢您的帮助

谢谢,
保罗

我建议采取3项行动

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

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


3-我建议将此CTE作为一个预先准备好的语句,并以标准jdbc方式使用。

H2仅支持不带命名参数的递归CTE。

谢谢Christian,我已经完成了1和2,将研究3。谢谢