【发布时间】: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