我对排序有问题。
存储库方法:
@Query(nativeQuery = true,
value = "SELECT D.ID as dealerId , D.NAME as dealerName, K.ID as kpiId, " +
"K.NAME as kpiName FROM REGION R, DEALER D, KPI K "
+ "WHERE R.IMPORTER_ID = :importerId "
+ "AND D.REGION_ID = R.ID "
+ "AND K.IMPORTER_ID = :importerId ")
Page<DealersKpiTargets> getDealersKpiTargets(@Param("importerId") Long importerId, Pageable pageable);
可分页对象:
Page request [number: 0, size 20, sort: name: DESC]
休眠日志:
Hibernate: SELECT D.ID as dealerId , D.NAME as dealerName, K.ID as kpiId, K.NAME as kpiName FROM REGION R, DEALER D, KPI K WHERE R.IMPORTER_ID = ? AND D.REGION_ID = R.ID AND K.IMPORTER_ID = ? order by R.name desc limit ?
我不明白R.name
前缀是从哪里来的,在Hibernate
的order by
部分(接近结尾)。
作为参考,我使用:
spring-data-jpa版本2.0.7.RELEASE
spring-boot-starter-data-jpa版本2.0.2.RELEASE
更新
我已经解决了这个问题,将查询从原生查询改为jpa查询,并且它可以正常工作。我把卡丁车改成了加入版。
@Query("SELECT dealerEntity.id AS dealerId , dealerEntity.name AS dealerName, kpiEntity.id AS kpiId, " +
"kpiEntity.name AS kpiName FROM KpiEntity kpiEntity "
+ "JOIN RegionEntity regionEntity ON regionEntity.importerEntity = kpiEntity.importerEntity "
+ "JOIN DealerEntity dealerEntity ON dealerEntity.importerEntity = regionEntity.importerEntity "
+ "WHERE kpiEntity.importerEntity = :importerEntity ")
Page<DealersKpiTargets> getDealersKpiTargets(@Param("importerEntity") ImporterEntity importerEntity, Pageable pageable);
5条答案
按热度按时间i5desfxk1#
这里是jira票与更多的细节,可以为解决方案(https://jira.spring.io/browse/DATAJPA-1613)的关键。
QueryUtils.ALIAS_MATCH
负责不正确的别名提取。我的解决方案是重写本机查询,因此它与提供的regexp不匹配。
z0qdvdin2#
现在回答这个问题可能有点晚了。但我想分享一下我是如何解决这个问题的。对于本机查询,在应用排序条件时,似乎Hibernate试图使用查询中使用的第一个表的别名。在您的例子中,第一个表别名是
R
,因此您在hibernate生成的查询中看到R.name desc
。解决此问题的一种方法是将查询 Package 在select子句中,并将其命名为
R
,如这样,在运行时,Hibernate会在查询的顶部应用排序条件,现在对应于
R
。tag5nh1u3#
它有排序类,你可以使用这个。除此之外,它很容易使用。
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.sorting
qcuzuvrc4#
我遇到了类似的问题,特别是在复杂查询的情况下,查询中有
ORDER BY
。我得到语法错误,因为,
被添加到ORDER BY
之前。我解决这个问题的方法是创建一个
VIEW
,其中SELECT
查询具有结果集和WHERE
条件所需的必要字段(因此您可以在WHERE
条件下对VIEW
运行带有参数的查询)。并将本机查询写入SELECT
FROM
VIEW
enyaitl35#
对于任何搜索简单解决方案的人,您可以使用JPASort.by(),它不会向结果查询添加别名