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;
Author: skaffman, 2010-02-12

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.

 17
Author: mindas,
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.

 3
Author: Rachel,
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.

 1
Author: Péter Török,
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ć:

  1. 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.
  2. Użyj setFetchMode zgodnie z innymi odpowiedziami.
  3. Użyj kryteriów.createAlias (lub createCriteria). Pozwala to również na dalsze ograniczanie wierszy, które chcesz połączyć.
 0
Author: meriton,
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