我的数据库中有一个父表和一个子表,并且在它们对应的实体类中有一个 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 查询中。