2010-02-12 5 views
13

est-il possible avec les critères Hibernate?Les critères Hibernate et la jointure multiple

select A.something, B.something, C.something, D.something 
    from A JOIN B on A.id = B.id_fk 
      JOIN C ON B.id = C.id_fk 
      JOIN D ON C.id = D.id_fk; 
+0

http://stackoverflow.com/questions/8726396/hibernate-criteria-join-with-3-tables lien ci-dessus mentionné peut vous aider. –

Répondre

17

J'ai eu exactement le même problème, et a été en mesure de le résoudre comme ceci:

return criteria.createCriteria(A.class) 
       .createCriteria("b", "join_between_a_b") 
       .createCriteria("c", "join_between_b_c") 
       .createCriteria("d", "join_between_c_d") 
       .add(Restrictions.eq("some_field_of_D", someValue)); 

Note: "b", "c" et "d" dans le code font référence ci-dessus pour attribuer des noms à A, B et C classes, en conséquence (la classe A a l'attribut b et ainsi de suite).

Pour cette solution, vous n'avez même pas besoin d'avoir les paramètres lazy et fetch à définir dans votre A.hbm.xml.

+0

Que diriez-vous pour le SQL suivant: sélectionnez A.columnA1, B.columnB1, C.columnC1 d'une jointure interne B sur A.fk_id = B.id jointure interne C sur C.fk_id = B.id? – maximilianus

+0

Veuillez ouvrir une question distincte pour cela. – mindas

1

Essayez de régler le mode de récupération dans vos critères, comme:

criteria.setFetchMode(..., FetchMode.EAGER) 

Cela crée une requête de jointure. Vous pouvez trouver plus de dà © tails here.

2

Il existe quelques bons exemples dans le Hibernate Reference material qui montrent utiliser setFetchMode pour récupérer des associations avec une jointure externe.

Un exemple est:

List books = sess.createCriteria(Book.class) 
.setFetchMode("chapters", FetchMode.EAGER) 
.setFetchMode("reviews", FetchMode.EAGER) 
.list(); 

Il y a aussi information there about different fetching stragies qui peut être utile pour vous.

+0

En fait, cela n'a pas fonctionné pour moi, j'ai dû le faire comme dans la réponse que j'ai posté. Ce pourrait être parce que j'avais un critère supplémentaire sur le «D». – mindas

0

Oui, en fait, il y a plusieurs façons de le faire:

  1. Lors du mappage de l'association, définissez son lazyness false et son mode de récupération à rejoindre. Cela affectera toutes les requêtes de critères.
  2. Utilisez setFetchMode comme indiqué par les autres réponses.
  3. Utilisez criteria.createAlias ​​(ou createCriteria). Cela vous permet également de restreindre davantage les lignes que vous voulez joindre.