Hibernate: переопределение отображения EAGER в HQL?
В HQL можно переопределить LAZY
с помощью LEFT JOIN FETCH
.
FROM Obj AS obj LEFT JOIN FETCH obj.otherObj WHERE obj.id = :id
Можно ли переопределить EAGER
? Как?
Ответы
Ответ 1
Отборщик в этом фрагменте из Hibernate Docs подразумевает, что вы можете отменить ленивый с нетерпением, но не наоборот:
Если вы используете ленивый уровень свойств выборка (с байт-кодом инструментария), можно заставить спящий режим взять ленивый свойства в первом запросе немедленно использовать выборку свойства.
Необычно, похоже, вы можете, если используете API критериев, чтобы перейти от нетерпения к лени. Просто позвоните setFetchMode(FetchMode.LAZY)
в соответствующее соединение.
Ответ 2
У меня была ситуация, которая по историческим причинам действительно вызывала выбор между несколькими зависимостями "один-ко-многим". В течение многих лет многие места зависели от этого, поэтому было трудно отключить. Однако в некоторых случаях нетерпеливая выборка мешала: для каждого большего выбора в таблице она создавала бы 100 с небольших подзапросов для каждой из коллекций каждого из объектов. Я нашел способ обойти это, не переопределяя нетерпеливую выборку, но для меня так же полезно: просто создайте один запрос, который выполняет все подтипы одновременно. Это сделает 1 физический запрос к базе данных, вместо того, чтобы спящий режим прошел график зависимостей и породил 100 запросов.
Итак, я заменил
Query q = session.createQuery("from Customer c");
по
Query q = session.createQuery("from Customer c " +
"left join fetch c.vats v " +
"left join fetch v.klMemos bk " +
"left join fetch bk.ferryKlMemos");
1 У клиента много номеров НДС, 1 номер НДС имеет много klmemos и т.д. Старая ситуация сначала забирала только клиентов, а спящий режим затем начинал собирать каждую зависимую коллекцию один за другим. Вторая форма загрузит все в один исходный запрос, а hibernate найдет все необходимое для заполнения желаемых коллекций в кеше объектов.
Обратите внимание, что этот подход также имитирует быструю выборку для коллекций, которые настроены на то, чтобы быть ленивыми, поскольку вы заполняете все "ленивые" коллекции с нетерпением (и эффективным) способом.