Может ли Hibernate отобразить набор результатов объединения 1: M в подвыборе к родительскому элементу с дочерней коллекцией? - PullRequest
0 голосов
/ 06 апреля 2020

Я пытаюсь сопоставить результат левого соединения SQL со структурой объекта вида parent -> [child] , где условие в запросе SQL ограничивает результат до один родитель. Результирующий набор содержит n строк, потому что есть n дочерних элементов, но, конечно, каждая строка принадлежит только одному родителю.

Я использую Hibernate и поместил @Subselect в мою «родительскую» сущность, и это содержит весь мой запрос на левое соединение.

@Subselect("SELECT x.*, y.* FROM x INNER JOIN y on x.a = y.a WHERE x.a = 1")
public class X {
   ... X attributes
   private List<Y>;
}
public class Y {
   ... Y attributes
}

Как я могу дать Hibernate команду «свернуть» столбцы с левой стороны результирующего набора в один родительский объект и объединить оставшиеся столбцы из каждой строки во множество экземпляров «child», которые добавлены в список на родительском?

Возможно ли это, или мне нужно присоединиться, используя аннотацию @OneToMany Hibernates. Это работает для меня, но приводит к двум отдельным вызовам базы данных, что я считаю неэффективным.

1 Ответ

0 голосов
/ 24 апреля 2020

Этого можно достичь с помощью JPQL (или HQL, если вы используете Hibernate) и команды 'join fetch':

SELECT a from Author a left join fetch a.books;

Попытка выполнить несколько соединений таким способом может привести к появлению исключения MultipleBagFetchException. Это можно обойти, но в любом случае, обрабатывая объединения (особенно несколько объединений) на сервере БД, мы создаем набор результатов декартовых продуктов, который может стать очень большим.

Неудивительно, что на самом деле может быть более эффективным сделать несколько обращений к базе данных (используя пакетную обработку для смягчения N + 1), а затем соединить родительский и дочерний элементы в памяти с помощью ORM.

Спасибо { ссылка } за множество указателей на эту топику c в Интернете, в частности за эту статью в его блоге - { ссылка }

...