Kryteria hibernacji i wielokrotne łączenie
Czy jest to możliwe przy kryteriach Hibernate?
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;
4 answers
Mam dokładnie ten sam problem i udało mi się go rozwiązać w ten sposób:
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 powyższym kodzie odnoszą się do nazw atrybutów w A
, B
i C
klasy, odpowiednio (klasa A
ma atrybut b
i tak dalej).
Do tego rozwiązania nie musisz nawet mieć lazy
i fetch
parametrów do Ustawienia w A.hbm.xml
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-23 18:18:35
Jest kilka dobrych przykładów w Hibernate Reference material , które pokazują użycie setFetchMode do pobierania skojarzeń z zewnętrznym łączeniem.
Przykład:
List books = sess.createCriteria(Book.class)
.setFetchMode("chapters", FetchMode.EAGER)
.setFetchMode("reviews", FetchMode.EAGER)
.list();
Są tam również informacje o różnych stragies pobierania , które mogą być przydatne dla Ciebie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-10 17:59:10
Spróbuj ustawić tryb pobierania w swoich kryteriach, na przykład:
criteria.setFetchMode(..., FetchMode.EAGER)
To tworzy zapytanie join. Więcej szczegółów znajdziesz tutaj.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-13 13:54:58
Tak, w rzeczywistości jest kilka sposobów, aby to zrobić:
- podczas mapowania asocjacji, ustaw jej lazyness na false i jego tryb pobierania do połączenia. Będzie to miało wpływ na wszystkie zapytania dotyczące kryteriów.
- Użyj setFetchMode zgodnie z innymi odpowiedziami.
- Użyj kryteriów.createAlias (lub createCriteria). Pozwala to również na dalsze ograniczanie wierszy, które chcesz połączyć.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-13 14:08:11