2017-08-18 3 views
0

Ich erstelle derzeit eine komplexe Abfrage mit JPA CriteriaBuilder.
In dieser Abfrage schließe ich ein wenig Datenbanken. Jetzt brauche ich nur den letzten Eintrag einer verbundenen Tabelle. Aber ich weiß nicht, wo ich das in der Abfrage anwenden muss.JPA Criteria Query Builder: letzten Eintrag abrufen

Hier ist eine Dummy-Abfrage 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))); 
} 

Ich brauche jetzt nur den letzten Eintrag des ListJoin class3, wie kann ich das tun?

Grüße

+0

Was ist "letzter Eintrag"? letztes Element eines Listenfeldes? Stellen Sie die Entity-Klassen –

+0

@NeilStockton Ja letztes Element einer Liste Lars

Antwort

0

Ich habe eine Lösung gefunden.
Ich brauchte den folgenden Code hinzuzufügen:

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)); 

ich mir jemand helfen könnte hoffen.

+0

wird das funktionieren, wenn Objekte in der Liste in einer anderen Reihenfolge als ihre "ID" platziert werden? –

+0

Das ist eine gute Frage: Denken: – Lars

0

Zunächst, wenn Sie die Reihenfolge der Elemente in einer Liste interessiert, benötigen Sie die @OrderColumn Annotation. Die Abhängigkeit von einem anderen Mechanismus zum Aufrechterhalten der Listenreihenfolge hängt vom Datenbank- und Persistenzanbieter ab und ist im Allgemeinen unzuverlässig. Wenn Sie das bereits haben, sollten Sie class3.order() mit cb.size(class3) in einem Prädikat kombinieren können.