2016-06-29 56 views
9

我有一個類Lawsuit,它包含一個List<Hearing>,每個屬性都有一個Date屬性。在JPA 2標準API中選擇DISTINCT + ORDER BY API

,我需要選擇所有Lawsuit S按日期排序他們Hearing小號

我有一個CriteriaQuery中像

CriteriaBuilder   cb = em.getCriteriaBuilder(); 
CriteriaQuery<Lawsuit> cq = cb.createQuery(Lawsuit.class); 
Root<Lawsuit>   root = cq.from(Lawsuit.class); 

我用不同扁平化的結果:

cq.select(root).distinct(true); 

然後我加入LawsuitHearing

Join<Lawsuit, Hearing> hearing = root.join("hearings", JoinType.INNER); 

創建Predicate小號

predicateList.add(cb.isNotNull(hearing.<Date>get("date"))); 

Order S:如果我避免distinct

orderList.add(cb.asc(hearing.<Date>get("date"))); 

一切工作正常,但如果我使用它,它抱怨不能夠根據不在SELECT中的字段進行訂購:

Caused by: org.postgresql.util.PSQLException: ERROR: for SELECT DISTINCT , ORDER BY expressions must appear in select list

List<Hearing>已經可以通過Lawsuit類返回,所以我很困惑:我應該如何將它們添加到選擇列表中?

+0

好吧,你需要一個子選擇的列表,然後也許你可以把訂單在子選擇?我現在沒有時間看它。 –

+0

謝謝@Nicholas;你將如何使用標準api來進行內部查詢? –

+0

[This answer](http://stackoverflow.com/a/35915532/4754790)可能會有所幫助。 –

回答

5

我在其他地方發現了問題的根源,解決它並沒有必要去做問題中提出的問題; 正如其他答案中所述,在這裏執行distinct應該是沒有必要的。

重複的行被髮起的對集合(根對象的屬性)所執行的錯誤left join S甚至如果不被使用的謂詞:

Join<Lawsuit, Witness> witnesses = root.join("witnesses", JoinType.LEFT); 
if (witnessToFilterWith!=null) { 
    predicateList.add(cb.equal(witnesses.<Long>get("id"),witnessToFilterWith.getId())); 
} 

join顯然應作爲inner來執行,並且僅在需要

if (witnessToFilterWith!=null) { 
    Join<Lawsuit, Witness> witnesses = root.join("witnesses", JoinType.INNER); 
    predicateList.add(cb.equal(witnesses.<Long>get("id"),witnessToFilterWith.getId())); 
} 

所以,如果你在這裏,因爲你得到了同樣的問題,搜索連接中的問題。

0

你也可以去複製通過組由基於根表的主鍵列:

cq.groupBy(root.get("id")); // Assuming that Lawsuite.id is primary key column