2012-05-14 11 views
6

Mam strukturę takiego:Hibernate Query Language (HQL) - Zapytania dla leniwych/nie-lazy loading

  • A zawiera zbiór B (odwzorowany jako nie-leniwy)
  • B zawiera kolekcję C (zamapowany jako nie-leniwy)

Chciałbym utworzyć zapytanie, które pobiera obiekty, które zawierają obiekty B bez obiektów C w nich. Czy to jest możliwe? W drugą stronę też zadziała dla mnie (jeśli relacja B-C jest odwzorowana leniwo, a zapytanie pobiera A, zawierające B i C).

Dzięki!

+0

Możliwy duplikat [Hibernate: Przesłanianie odwzorowania EAGER w HQL?] (Http://stackoverflow.com/questions/3072568/hibernate-overriding-mappings-eager-in-hql) – davidwebster48

Odpowiedz

5

Nie, to niemożliwe. Ponieważ oznaczyłeś samo stowarzyszenie jako ładnie załadowane, Hibernate zawsze będzie ładować to skojarzenie z niecierpliwością.

Jeśli zaznaczysz stowarzyszenie jako leniwe (domyślny dla stowarzyszeń toMany), potem trzeba th możliwość chętnie ściągam je w zapytaniu, używając join fetch:

select a from A a left join fetch a.bs b left join fetch b.cs 

Zauważ, że to nie będzie działać, jeśli obie kolekcje to torby (tj. Listy bez kolumny indeksu).

+0

Witam, dziękuję za odpowiedź. Znalazłem ten temat też, odpowiedź jest taka sama: http://stackoverflow.com/questions/3516873/hql-fetch-join-collections-from-edager-table Ale mam pewne problemy, dzięki czemu działa dobrze- wielokrotnie mnoży "A". Najprawdopodobniej mój błąd. – Mooncrosser

+0

Rozwiązany, "odrębny" jest potrzebny, aby działał poprawnie (nie jestem ekspertem i nie mam pojęcia, jaka jest różnica). Zaznaczę to jako poprawną odpowiedź, ale będzie miło, jeśli ją edytujesz lub powiedz mi, gdzie jest różnica :) – Mooncrosser

+1

Bez wyraźnego, Hibernacja zwraca 1 wynik na wiersz zestawu wyników JDBC. Oznacza to, że jeśli masz tylko jeden A z 2 Bs, a każdy B ma 2 Cs, zapytanie zwróci 4 wiersze, a lista będzie zawierała 4 razy to samo wystąpienie A. Odmienne słowo kluczowe sprawia, że ​​Hibernate usuwa duplikaty z listy . –