簡體   English   中英

Spring 數據 JPA 規格 - 不同 + 在連接中按列排序

[英]Spring Data JPA Specifications - Distinct + order by column in join

我有一些與“and”結合的規范:

Specification.where(predicate1).and(predicate2).and(predicate3);

其中一個有不同的集合:

query.distinct(true);

另一個人對連接中的列進行排序。

query.orderBy(builder.desc(bJoin.get("orderbyColumn")));

這將失敗,並出現SQLGrammarException ,說明按列的順序應該是不同的。

所以基本上我們有實體A,主要實體,和一些嵌套實體B,我們從A select,但想按B訂購,並且在生成的sql中它只從A中選擇列。我發現使它工作的唯一方法(=也從 B 使它成為 select )是用獲取替換連接:

Fetch < A, B > bFetch = root.fetch("joinCol", JoinType.INNER);
Join < A, B > bJoin = (Join < A, B > ) bFetch;

工作了一段時間,在 H2 本地測試,但過了一段時間開始出現另一個錯誤:

org.hibernate.QueryException:查詢指定連接提取,但提取關聯的所有者不在 select 列表中

我通過要求某些列不是 null,但在使用 PostgreSQL 的真實服務器中,以某種方式在指向 H2 的本地解決了它,它根本不起作用,在存在提取的所有情況下都會出現該錯誤。

我的問題是:在未獲取的嵌套實體上使用distinctorderby的正確方法是什么? 我的fetch解決方案是否正常,只需要修復(如果是的話如何修復?)或者我應該 go 完全用於另一個選項?

對於實際查詢,我使用這種方法:

findAll(Specification<>, Pageable)

有沒有辦法用 order by (某種子查詢?)來獨特地包裝整個查詢並繞過所有這些噩夢? 讓它生成這樣的查詢:

select distinct colA1, colA2, coAl3 from (select colA1, colA2, coAl3 

from A inner join B b on ........ order by b.colB1)

我是否需要手動將我的規范轉換為謂詞並用它做其他事情來嘗試解決我的問題(某種混合方法)?

任何建議將不勝感激。

我遇到了同樣的錯誤,但實際上它不是錯誤:)

findAll(Specification<>, Pageable) 這個方法拋出 2 個不同的查詢。

第一個是計數查詢,您必須小心。 其次是您實際執行的行查詢。

您可以使用下面的代碼檢查查詢類型

if (query.getResultType() != Long.class && query.getResultType() != long.class){
   root.fetch("entity1");
} 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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