Критерии гибернации и множественное присоединение

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

person Andrea Scarafoni    schedule 12.02.2010    source источник
comment
stackoverflow.com/questions/8726396/ Вышеупомянутая ссылка может вам помочь.   -  person Ishwar Pohani    schedule 15.01.2013


Ответы (4)


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

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.

person mindas    schedule 23.02.2011
comment
Как насчет следующего SQL: выберите A.columnA1, B.columnB1, C.columnC1 из A внутреннего соединения B на A.fk_id = B.id внутреннего соединения C на C.fk_id = B.id? - person maximilianus; 27.06.2014
comment
Пожалуйста, откройте для этого отдельный вопрос. - person mindas; 12.09.2014

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

Пример:

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

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

person Rachel    schedule 12.02.2010
comment
На самом деле это не сработало для меня, мне пришлось сделать это, как в ответе, который я опубликовал. Это могло быть потому, что у меня были дополнительные критерии для D. - person mindas; 23.02.2011
comment
FetchMode.EAGER в настоящее время устарел, вместо этого используйте FetchMode.JOIN. - person Tim Büthe; 13.08.2019

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

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

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

person Péter Török    schedule 12.02.2010

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

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