我有排序问题。
存储库方法:
@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
前缀来自order by
部分Hibernate
(到最后)。
供参考,我正在使用:
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);
答案 0 :(得分:1)
回答这个问题可能有点晚了。但是想分享一下我如何解决这个问题。
对于本机查询,休眠似乎在应用排序条件时尝试使用查询中使用的第一个表的别名。在您的情况下,第一个表别名为R
,因此您在由hibernate生成的查询中看到R.name desc
。
解决此问题的一种方法是将查询包装在select子句中,并将其命名为R
,例如
"SELECT * FROM(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 ) R"
通过这种方式,运行时休眠将在查询顶部应用排序条件,该条件现在对应于R
。
答案 1 :(得分:0)
它有排序类,你可以使用它。此外,它易于使用。
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.sorting
答案 2 :(得分:0)
这是jira票证,其中包含更多详细信息,可以作为解决问题的关键(https://jira.spring.io/browse/DATAJPA-1613)。
QueryUtils.ALIAS_MATCH
(?<=from)(?:\s)+([._[\P\\{Z}&&\P\\{Cc}&&\P\\{Cf}&&\P\\{P}]]+)(?:\sas)*(?:\s)+(?!(?:where|group\s*by|order\s*by))(\w+)
负责错误的别名提取。我的案例的解决方案是重写本机查询,因此它与提供的正则表达式不匹配。