我在内存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保存数据(以确保数据保存在同一个数据库实例中),结果总是相同的,无论我做什么。
这个应用程序是在面试之前作为测试构建的,因此我已经迟到了。
非常感谢任何帮助。
谢谢, 圣保罗
答案 0 :(得分:1)
H2仅支持没有命名参数的递归CTE。
答案 1 :(得分:0)
我会建议3个动作。
1-如果有任何错误,请查看H2跟踪。
2-打开sql logger以检查代码生成的查询,并仔细检查两个参数的值。
3-我建议将此CTE作为准备好的声明,并使用标准的jdbc方式。