【问题标题】:JPA native query result returns duplicate child objectsJPA 原生查询结果返回重复的子对象
【发布时间】:2013-03-04 09:00:15
【问题描述】:

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

我希望使用 SQL 原生查询基于某些父属性检索所有父对象及其对应的子对象。

为此,我有一个 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

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

【问题讨论】:

  • 您是否尝试在您的选择查询中添加“distinct”?

标签: hibernate jpa hibernate-onetomany nativequery sqlresultsetmapping


【解决方案1】:

我会使用普通的 HQL 查询而不是本机查询。在 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 连接集合可以使用单个选择与其父对象一起初始化。

【讨论】:

  • 为什么要使用原生查询?在 HQL 中,这个问题可以通过 fetch join 来解决。我修改了答案。
  • 我想使用本机查询,因为我还想在一个查询中获取父母的孙子孙女等。 HQL/JPQL 为这种急切的提取给出了异常“不能同时提取多个包”。
猜你喜欢
  • 2021-09-14
  • 2012-04-03
  • 2012-07-15
  • 1970-01-01
  • 1970-01-01
  • 2019-05-23
  • 2010-09-29
  • 1970-01-01
  • 2021-02-13
相关资源
最近更新 更多