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

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

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

1 Ответ

3 голосов
/ 07 декабря 2010

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...