Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Landon KuhnОтветов: 1

Я нашел этот запрос 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

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

hibernatehql

Ответы

Ответ 1 · рейтинг 3 · octav

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

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

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

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы