Как получить родительские объекты с коллекцией дочерних объектов, используя собственный запрос hibernate jpa?

#hibernate #jpa #spring-data-jpa #jpql

#переход в спящий режим #jpa #spring-data-jpa #jpql

Вопрос:

Обычно я использую JPQL для запроса базы данных, но сегодня мне приходится использовать собственный запрос по соображениям производительности и для функций, недоступных в JPQL (подзапрос join). Используя JPQL, можно использовать join fetch для извлечения родительских объектов вместе с их коллекциями дочерних объектов. Однако, когда я пытаюсь использовать собственный запрос, для каждого родительского объекта возвращается несколько строк, каждая строка содержит данные родительского объекта и одного из его дочерних элементов. Затем возвращаемый список содержит дублированные объекты для родительского объекта. Предположим, что у одного родителя есть два дочерних объекта, тогда следующий запрос возвращает 2 родительских объекта в списке вместо 1.

 @Query(value="select * from Parent p left join Child c on p.parent_id = c.parent_id", nativeQuery = true)
List<Parent> getParents()
  

Кто-нибудь знает, как избежать дублирования родительских объектов, чтобы он возвращал тот же результат, что и ниже

 @Query(value="select p from Parent p left join fetch p.children")
List<Parent> getParents()
  

Ответ №1:

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

Если вас интересует подход, позволяющий вам оставаться в рамках модели JPA, вам следует взглянуть на Blaze-Persistence, который предлагает поддержку подзапросов в предложении from поверх JPA / Hibernate: https://persistence.blazebit.com/documentation/core/manual/en_US/index.html#subquery-in-from-clause

С представлениями сущностей и интеграцией Spring-Data все это может быть очень просто. Если вы поделитесь своим вариантом использования и вам интересно, я могу помочь вам выяснить, как это могло бы выглядеть.