2017-08-18 1 views
0

Je suis en train de créer une requête complexe avec JPA CriteriaBuilder.
Dans cette requête, je rejoins une petite base de données. Maintenant, je n'ai besoin que de la dernière entrée d'une table jointe. Mais je ne sais pas où je dois appliquer cela dans la requête.JPA Criteria Query Builder: Obtenir la dernière entrée

Voici un mannequin requête 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))); 
} 

Maintenant je besoin que la dernière entrée du ListJoin class3, comment puis-je faire cela?

Salutations

+0

qu'est ce que "last entry"? dernier élément d'un champ Liste? Fournir les classes d'entité –

+0

@NeilStockton Oui dernier élément d'une liste Lars

Répondre

0

J'ai trouvé une solution.
je besoin d'ajouter le code suivant:

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

J'espère que je pouvais aider quelqu'un.

+0

cela fonctionnera-t-il si les objets sont placés dans la liste dans un ordre différent à leur "id"? –

+0

C'est une bonne question: penser: – Lars

0

Tout d'abord, si vous tenez à l'ordre des éléments dans une liste, vous avez besoin de l'annotation @OrderColumn. En fonction de tout autre mécanisme de gestion de la liste, l'ordre dépend de la base de données et du fournisseur de persistance et, dans le cas général, n'est pas fiable.

En supposant que vous l'ayez déjà, vous devriez pouvoir combiner class3.order() avec cb.size(class3) dans un attribut.