Критерии гибернации и множественное соединение - PullRequest
13 голосов
/ 12 февраля 2010

возможно с критериями 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 ]

17 голосов
/ 23 февраля 2011

У меня точно такая же проблема, и я смог решить ее следующим образом:

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

Примечание: "b", "c" и "d" в приведенном выше коде относятся к именам атрибутов в классах A, B и C соответственно (класс A имеет атрибут b и т. Д. на).

Для этого решения вам даже не нужно иметь параметры lazy и fetch, которые должны быть установлены в вашем A.hbm.xml.

2 голосов
/ 12 февраля 2010

В справочном материале Hibernate есть несколько хороших примеров, показывающих использование setFetchMode для извлечения ассоциаций с внешним соединением.

Пример:

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

Там также есть информация о различных извлекающих штаммах , которые могут быть вам полезны.

1 голос
/ 12 февраля 2010

Попробуйте установить режим выборки по вашим критериям, например:

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

Это создает запрос на соединение. Вы можете найти более подробную информацию здесь .

0 голосов
/ 13 февраля 2010

Да, на самом деле есть несколько способов сделать это:

  1. При отображении ассоциации установите для ее ленивости значение false и режим извлечения, чтобы присоединиться. Это повлияет на все критерии запроса.
  2. Используйте setFetchMode, как подробно описано в других ответах.
  3. Используйте crit.createAlias ​​(или createCriteria). Это также позволяет дополнительно ограничивать строки, к которым вы хотите присоединиться.
...