hibernate - JPA原生查询结果返回重复的子对象

标签 hibernate jpa hibernate-onetomany nativequery sqlresultsetmapping

我的数据库中有一个父表和一个子表,并且它们在相应的实体类中有一个 OneToMany 映射。子表有一个外键parent_id。我将 JPA 2 与 Hibernate 和 MySQL DB 结合使用。

我希望使用 SQL Native 查询根据某些父属性检索所有父对象及其相应的子对象。

为此,我有一个 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: Parent@3966c600, Child: Child@1
Parent: Parent@3966c600, Child: Child@1
Parent: Parent@3966c600, Child: Child@1
Parent: Parent@3966c600, Child: Child@1
Parent: Parent@3966c600, Child: Child@1
Parent: Parent@3966c600, Child: Child@1
Parent: Parent@3966c600, Child: Child@1
Parent: Parent@3966c600, Child: Child@1

我不明白这是为什么。有没有什么方法(映射)可以通过 native 查询获取所有(不同的)子对象。 使用列名获取可以工作,并且不需要相应的对象映射,但我想获取子表的所有列,因此更喜欢在 sql 查询中使用用户 c.* 。

最佳答案

我会使用普通的 HQL 查询而不是 native 查询。在 HQL 中,您可以使用 fetch join:

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

通过 fetch 连接集合,可以使用单个选择与其父对象一起初始化。

关于hibernate - JPA原生查询结果返回重复的子对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15435923/

相关文章:

java - 使用 JPA 1.0 注释派生复合键(复合键多对一)

java - 我应该依赖数据库进行 Hibernate 属性验证吗?

hibernate-mapping - 如何将 "insert=' false' update ='false' "映射到也在一对多 FK 中使用的复合 ID 键属性上?

java - Hibernate无法正确操作多个包

java - 即使启用所有属性后,Hibernate 也不记录触发的 SQL 查询

java - 学习 Criteria 而不是 hql,如何使用对象列表使用条件进行查询?

java - 拥有一方的真正含义是什么?

java - JPA 多对多关系导致无限递归和堆栈溢出错误

spring-boot - 如何使用下划线变量解决 Spring Boot findBy 方法

java - Hibernate 是否可以通过一次选择获取两层集合?