Критерии спящего режима и множественное соединение

возможно с помощью критериев 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;

Ответы

Ответ 1

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

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, соответственно (class A имеет атрибут B и так далее).

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

Ответ 2

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

Пример:

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

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

Ответ 3

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

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

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

Ответ 4

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

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