![](/img/trans.png)
[英]Spring Data JPA - Order By : Sorting with Method Name vs Sort Class
[英]Spring jpa native query sorting adding prefix to order by field name
我有排序问题。
存储库方法:
@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);
可分页 object:
Page request [number: 0, size 20, sort: name: DESC]
Hibernate 日志:
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);
现在回答这个问题可能有点晚了。 但想分享我是如何解决这个问题的。 对于本机查询,似乎 hibernate 在应用排序条件时尝试使用查询中使用的第一个表的别名。 在您的情况下,第一个表别名是R
因此您会在 hibernate 生成的查询中看到R.name desc
。
解决此问题的一种方法是将查询包装在 select 子句中并将其命名为R
like
"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
相对应。
它有 Sort 类,你可以使用它。 此外,它易于使用。
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.sorting
这是带有更多细节的 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+)
负责不正确的别名提取。 我的情况的解决方案是重写本机查询,因此它与提供的正则表达式不匹配。
我遇到了类似的问题,尤其是在查询中包含ORDER BY
的复杂查询的情况下。 我收到语法错误,因为在ORDER BY
之前添加了,
。
我解决此问题的方法是使用SELECT
查询创建一个VIEW
,该查询具有结果集和WHERE
条件所需的必要字段(因此您可以在WHERE
条件下针对VIEW
使用参数运行查询)。 并FROM
VIEW
将本机查询写入SELECT
CREATE VIEW my_view AS (// your complex select query with required fields);
@Query("SELECT field1 AS alias1, field2 AS alias2 FROM my_view "
+ "WHERE field3 = :param1 AND field4 = :param2")
Page<MyDto> myFunction(@Param("param1") Long param1, @Param("param1") String param2, Pageable pageable);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.