FETCH JOIN максимальная глубина? - PullRequest
4 голосов
/ 22 февраля 2012

W пытался получить соединение на трех уровнях:

JOIN FETCH entity1.collection1.collection2  // two OneToMany relations

но получил:

org.hibernate.HibernateException: Errors in named queries: [...]

Это из-за того, что он был слишком глубоким или из-за того, что коллекция коллекций не может быть получена таким образом? Моя максимальная глубина выборки равна 3, если это уместно.

В то же время я могу выполнить тройное извлечение соединения с другой стороны:

JOIN FETCH entity3.entity2.entity1  // two ManyToOne relations

Каким-то образом я не могу найти в спецификации JPA или в документах Hibernate ничего, что могло бы ограничить глубину этого предложения.

1 Ответ

4 голосов
/ 22 февраля 2012

collection1 относится к типу Collection. И Collection не имеет поля collection2. Вот как я рассуждаю о таких запросах.

Вы должны создать явное объединение для коллекции:

select e from Entity1 e
left join fetch e.collection1 as c1
left join fetch c1.collection2 as c2

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

...