簡體   English   中英

Spring jpa 本機查詢排序添加前綴以按字段名稱排序

[英]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前綴是從哪里來的,按照Hibernateorder 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM