4

У меня есть родительская таблица и дочерняя таблица в моей базе данных и имеют одно отображение ToToMany для них в соответствующих классах сущностей. Детский стол имеет внешний ключ parent_id. Я использую JPA 2 с Hibernate и MySQL DB.Исходный результат запроса JPA возвращает повторяющиеся дочерние объекты

Я хочу получить все родительские объекты и их соответствующие дочерние объекты на основе некоторого родительского свойства с помощью SQL Native Query.

Для этого у меня есть SqlResultSetMapping следующим образом:

@SqlResultSetMapping(name="ParentsWithChildren", 
     entities={ @EntityResult(entityClass = Parent.class), 
        @EntityResult(entityClass = Child.class)}) 

Я запрашивая следующим образом:

String queryString = "select p.*, c.* from parent p left join child c on p.id = c.parent_id where p.property = <some_property>"; 
Query query = entityManager.createNativeQuery(queryString, "ParentsWithChildren"); 
List<Object[]> resultList = query.getResultList(); 

На обходе по списку результатов, я считаю дубликат дочерних объектов для различных строк в моем детского стола, как показано на выходе:

for(Object obj[]: resultList){ 
     Parent parent = (Parent) obj[0]; 
     Child child = (Child) obj[1]; 
     System.out.println("Parent: " + parent + ", Child: " + child); 
} 

Выход:

Parent: [email protected], Child: [email protected] 
Parent: [email protected], Child: [email protected] 
Parent: [email protected], Child: [email protected] 
Parent: [email protected], Child: [email protected] 
Parent: [email protected], Child: [email protected] 
Parent: [email protected], Child: [email protected] 
Parent: [email protected], Child: [email protected] 
Parent: [email protected], Child: [email protected] 

Я не понимаю, почему это так. Есть ли способ (сопоставление) для получения всех (разных) дочерних объектов с помощью собственного запроса. Получение данных с именами столбцов может работать и не требует соответствующего сопоставления объектов, но я хочу получить все столбцы дочерней таблицы и, следовательно, предпочтет пользователю c. * В запросе sql.

+0

Вы пытались добавить «отдельный» в ваш запрос на выбор? –

ответ

0

Я бы использовал обычный HQL-запрос вместо собственного запроса. В HQL вы можете использовать выборки присоединиться:

"select p.*, c.* from parent p left join fetch child c on p.id = c.parent_id where p.property = <some_property>" 

С выборкой присоединиться к коллекции может быть инициализирована вместе с их объектами с помощью одного выбора.

+0

Использовал c.parent_id в коде. Исправлена ​​опечатка – dumbcoder

+0

Почему вы хотите использовать собственный запрос? В HQL эту проблему можно решить с помощью соединения fetch. Я испробовал ответ. –

+0

Я хочу использовать собственный запрос, потому что я также хотел бы приносить внуков, внуков и т. Д. Родительского элемента в одном запросе. В HQL/JPQL дается исключение «Невозможно одновременно получить несколько пакетов» для таких нетерпеливых выбирает. – dumbcoder

Смежные вопросы