2010-02-12 11 views
13

jest możliwe z kryteriami Hibernowania, zrób to?Kryteria hibernacji i wielokrotne dołączenie

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 Powyżej wspomniano łącza może pomóc. –

Odpowiedz

17

Mam dokładnie ten sam problem, i był w stanie rozwiązać go tak:

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

Uwaga: "b", "c" i "d" w kodzie powyżej odnoszą się do nazw atrybutów w A, B i C klasy, odpowiednio (klasa A ma atrybut b i tak dalej).

Dla tego rozwiązania nie trzeba nawet ustawiać parametrów lazy i fetch w swoim A.hbm.xml.

+0

Co na temat następującego SQL: wybierz A.columnA1, B.columnB1, C.columnC1 z A wewnętrznego łączenia B na A.fk_id = B.id wewnętrznego sprzężenia C na C.fk_id = B.id? – maximilianus

+0

Proszę otworzyć osobne pytanie na ten temat. – mindas

1

Spróbuj ustawić tryb pobierania danych w Twoich kryteriów, takich jak:

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

Stwarza to zapytanie przyłączenia. Możesz znaleźć więcej szczegółów here.

2

Istnieją pewne dobre przykłady w Hibernate Reference material, które pokazują, aby użyć setFetchMode do pobierania skojarzeń z łączeniem zewnętrznym.

Przykładem jest:

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

Istnieje również information there about different fetching stragies, które mogą być przydatne dla Ciebie.

+0

Właściwie to nie działało dla mnie, musiałem to zrobić tak, jak w odpowiedzi, którą napisałem. Mogło tak być, ponieważ miałem dodatkowe kryteria na 'D'. – mindas

0

Tak, w rzeczywistości istnieje kilka sposobów, aby to zrobić:

  1. Kiedy mapowanie stowarzyszenie, ustawić jego lazyness false i jego tryb przyłączenia sprowadzić. Wpłynie to na wszystkie zapytania o kryteria.
  2. Użyj setFetchMode zgodnie z innymi odpowiedziami.
  3. Użyj kryteriów.createAlias ​​(lub createCriteria). Pozwala to również na dalsze ograniczenie wierszy, które chcesz dołączyć.
Powiązane problemy