Hibernate HQL: использование JOIN для быстрой загрузки дочерних объектов?

Я нашел этот запрос HQL, который я пытаюсь понять. В комментарии говорится, что LEFT JOIN заставляет Hibernate жадно загружать связанные объекты в дочернюю таблицу, а модификатор DISTINCT необходим для фильтрации повторяющихся родительских объектов в наборе результатов. Эти комментарии имеют смысл? Я никогда раньше не видел соединения, используемого таким образом.

SELECT DISTINCT p FROM Parent AS p
LEFT JOIN p.children AS c
WHERE p.state = 1
ORDER BY p.modified

Примечание c не используется в предложениях WHERE или ORDER BY.

Кажется, было бы безопасно заменить этот запрос на более простой:

SELECT p FROM Parent AS p
WHERE p.state = 1
ORDER BY p.modified

Но я не уверен, есть ли уважительная причина, чтобы исходный запрос был написан как есть.


person Landon Kuhn    schedule 06.12.2010    source источник


Ответы (1)


Согласно документации Hibernate:

Соединение «выборка» позволяет инициализировать ассоциации или наборы значений вместе с их родительскими объектами с помощью одного выбора. Это особенно полезно в случае коллекции. Он эффективно переопределяет внешнее соединение и ленивые объявления файла сопоставления для ассоциаций и коллекций.

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html

Таким образом, только соединение «выборка» вызывает загрузку упомянутых коллекций. В вашем случае у вас нет соединения «выборка», поэтому я не думаю, что коллекция дочерних элементов будет загружена с помощью этого запроса.

Другими словами, да, вы можете заменить запрос вторым.

person octav    schedule 07.12.2010