JPA本机查询结果返回重复的子对象

时间:2013-03-15 15:15:35

标签: hibernate jpa hibernate-onetomany nativequery sqlresultsetmapping

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

我希望根据具有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: 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

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

1 个答案:

答案 0 :(得分:0)

我会使用普通的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可以使用单个select来初始化连接集合及其父对象。

相关问题