![](/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.