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 найдет все необходимое для заполнения желаемых коллекций в кеше объектов.

Обратите внимание, что этот подход также имитирует быструю выборку для коллекций, которые настроены на то, чтобы быть ленивыми, поскольку вы заполняете все "ленивые" коллекции с нетерпением (и эффективным) способом.