2010-02-12 11 views
13

ist mit Hibernate-Kriterien möglich, oder?Hibernate-Kriterien und multiple Join

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 Die oben genannten Link kann Ihnen helfen. –

Antwort

17

Ich habe genau das gleiche Problem bekam, und konnte es so lösen:

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

Hinweis: "b", "c" und "d" in obigem Code verweisen Namen in A, B und C zuzuschreiben Klassen entsprechend (Klasse A hat Attribut b und so weiter).

Für diese Lösung müssen nicht einmal lazy und fetch Parameter in Ihrem A.hbm.xml eingestellt werden.

+0

Wie wäre es für die folgende SQL: Wählen Sie A.columnA1, B.columnB1, C.columnC1 aus A innere Join B auf A.fk_id = B.id innere Join C auf C.fk_id = B.id? – maximilianus

+0

Bitte öffnen Sie dazu eine separate Frage. – mindas

1

Versuchen Sie, den Fetch-Modus in Ihren Kriterien einstellen, wie:

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

Dies schafft eine Join-Abfrage. Sie können weitere Details here finden.

2

Es gibt einige gute Beispiele in Hibernate Reference material, die zeigen, dass setFetchMode verwendet wird, um Verknüpfungen mit einem äußeren Join abzurufen.

Ein Beispiel ist:

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

Es ist auch information there about different fetching stragies, die Ihnen nützlich sein können.

+0

Eigentlich funktionierte das nicht für mich, ich musste es tun wie in der Antwort, die ich gepostet habe. Es könnte sein, dass ich ein zusätzliches Kriterium für das "D" hatte. – mindas

0

Ja, in der Tat gibt es mehrere Möglichkeiten, dies zu tun:

  1. Bei der Abbildung der Vereinigung, setzen Sie seine lazyness auf false und seine Fetch-Modus zu verbinden. Dies betrifft alle Kriterienabfragen.
  2. Verwenden Sie setFetchMode wie in den anderen Antworten beschrieben.
  3. Verwenden Sie criteria.createAlias ​​(oder createCriteria). Dadurch können Sie auch die Zeilen, die Sie verbinden möchten, weiter einschränken.