Критерии спящего режима и множественное соединение
возможно с помощью критериев 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). Это также позволяет вам ограничить количество строк, которые вы хотите объединить.