При получении соединения 3-го уровня не удается получить соединение - PullRequest
0 голосов
/ 23 января 2019

У меня есть три объекта: Person, Country и CountryTranslation.Person относится к одному Country, а Country имеет множество CountryTranslations.

. Я хочу, чтобы мой запрос извлекал Country и CountryTranslations, когда он выбирает Person, чтобыизбегать множественных запросов.

Чтобы вывести Country вместе с Person, я делаю:

List<Person> persons = (List<Person>) entityManager
                .createQuery("SELECT person from Person person " +
                             "left join fetch person.country")
                .getResultList()

Это работает нормально, я вижу, что в спящем режиме это красиво, и никакие дополнительные запросы не выполняются, чтобы принести Country, но чтобы вывести CountryTranslations, он все равно выполняет дополнительные запросы.Затем я попытался:

List<Person> persons = (List<Person>) entityManager
                .createQuery("SELECT person from Person person " +
                             "left join fetch person.country " +
                             "left join fetch person.country.translations")
                .getResultList()

И я получаю ошибку:

org.hibernate.QueryException: query specified join fetching, but the owner of the fetched association was not present in the select list 

Как правильно сделать эту выборку?

Заранее спасибо

1 Ответ

0 голосов
/ 23 января 2019

Вы исправляете это, давая псевдоним для каждого отношения.

SELECT person 
FROM  person person 
LEFT JOIN FETCH person.country country 
LEFT JOIN FETCH country.translations

Это «ограничение» платформы: при использовании связанных выборок вы должны давать псевдоним для каждого отношения!

Это поведение также можно объяснить, потому что будет трудно понять, что на самом деле означают эти связанные выборки: будет ли структура извлекать все отношения или только последние?Проще просто сообщить каркасу, какие отношения вы хотите получить.

...