2017-08-18 118 views
0

我目前正在用JPA CriteriaBuilder構建一個複雜的查詢。
在這個查詢中,我加入了一些小數據庫。現在我只需要加入表格的最後一個條目。但我不知道我在哪裏必須在查詢中應用。JPA標準查詢生成器:獲取最後一個條目

這是一個虛擬的JPA查詢:

private CriteriaQuery<Class2> getClass2Function { 
    CriteriaQuery<RootClass> cq = cb.createQuery(RootClass.class); 
    Root<RootClass> root = cq.from(RootClass.class); 
    Join<RootClass, Class2> class2 = root.join(RootClass_.class2Id); 
    ListJoin<Class2, Class3> class3 = class2.join(Class2_.listOfClass3); 

    List<Predicate> predicates = new ArrayList<>(); 
    predicates.add(cb.isNull(class3.get(SomeModel_.dtDl))); 
    predicates.add(cb.isNull(class2.get(SomeModel_.dtDl))); 
    predicates.add(cb.isNull(root.get(SomeModel_.dtDl))); 

    return cq.select(class2).where(predicates.toArray(new Predicate[] {})) 
       .orderBy(cb.asc(class2.get(Class2_.id))); 
} 

現在我只需要ListJoin class3的最後一項,我怎麼能做到這一點?

問候

+0

什麼是「最後一項」? List字段的最後一個元素?提供實體類 –

+0

@NeilStockton是List的最後一個元素 Lars

回答

0

我找到了解決辦法。
我需要添加以下代碼:

Subquery<Long> sq = cq.subquery(Long.class); 
Root<Class3> root = sq.from(Class3.class); 
sq.select(cb.max(root.get(Class3_.id))); 
predicates.add(cb.equal(class3.get(Class3_.id), sq)); 

我希望我能幫助別人。

+0

如果對象按照與其「id」不同的順序放置在列表中,它們將工作嗎? –

+0

這是一個很好的問題:思考: – Lars

0

首先,如果您關心列表中元素的順序,則需要@OrderColumn註釋。取決於維護列表順序的任何其他機制取決於數據庫和持久性提供者,並且在一般情況下不可靠。

假設你已經有了,你應該能夠將class3.order()cb.size(class3)合併成一個謂詞。

相關問題