2017-10-16 26 views
0

J'ai essayé de faire en sorte que Hibernate me génère une requête avec une sous-requête dans sa clause where. J'ai used this answer as a base to help me going, mais cette question a mentionné une seule table.Requête Hibernate avec sous-requête dans la clause WHERE et plusieurs jointures

Cependant, ce que je aurais besoin (dans SQL):

SELECT [...] 
FROM a 
LEFT OUTER JOIN b on a.idb = b.idb 
LEFT OUTER JOIN c on b.idc = c.idc 
[...] 
LEFT OUTER JOIN k out on j.idk = k.idk 
WHERE k.date = (SELECT max(date) from k in where in.idk = out.idk) OR k.date is null 

Comme je ne suis pas très habitué à utiliser Hibernate, je ne parviens pas à spécifier ces jointures internes lors de la navigation dans les contraintes internes. J'ai pu recréer les critères initiaux comme dans la réponse liée, mais je n'arrive pas à joindre les critères et les rootCriteria.

Répondre

0

Si les entités sont correctement jointes avec des annotations @ManyToOne, il suffit simplement de joindre les critères à la table précédente pour propager les critères à la requête entière.

Le code suivant semble fonctionner correctement pour ajouter la clause WHERE que je recherche.

DetachedCriteria kSubquery = DetachedCriteria.forClass(TableJPE.class,"j2"); 
kSubQuery = kSubQuery.createAlias("k","k2"); 
kSubQuery.setProjection(Projections.max("k2.date")); 
kSubQuery = kSubQuery.add(Restrictions.eqProperty("j.id", "j2.id")); 
rootCriteria.add(Restrictions.disjunction() 
    .add(Subqueries.propertyEq("k.date",kSubQuery)) 
    .add(Restrictions.isNull("k.date")));