Hibernate 能否将子查询中 1:M 联接的结果集映射到具有 child 集合的 parent?

Can Hibernate map the result set of a 1:M join in a subselect to a parent with a child collection?

我正在尝试将 SQL 左连接的结果映射到 object 形式的结构 parent -> [child ],其中 SQL 查询的条件将结果限制为一个 parent。结果集包含n行,因为有nchildren,当然每一行只属于单个parent。

我正在使用 Hibernate,并在我的 'parent' 实体上放置了一个 @Subselect,它包含了我的整个左连接查询。

@Subselect("SELECT x.*, y.* FROM x INNER JOIN y on x.a = y.a WHERE x.a = 1")
public class X {
   ... X attributes
   private List<Y>;
}
public class Y {
   ... Y attributes
}

如何指示 Hibernate 'collapse' 结果集左侧的列为单个 parent object,并将每一行的剩余列合并为多个'child' 的实例已添加到 parent?

的列表中

这可能吗,还是我需要使用 Hibernates 的 @OneToMany 注释加入。这对我来说确实有效,但会导致对数据库进行两次单独的调用,我觉得效率很低。

这可以使用 JPQL(如果您使用的是 Hibernate,则为 HQL)和 'join fetch' 命令来实现:

SELECT a from Author a left join fetch a.books;

尝试以这种方式执行多个连接会产生 'MultipleBagFetchException'。这可以解决,但无论如何,通过将连接(尤其是多个连接)转移到数据库服务器,我们会生成一个笛卡尔积结果集,该结果集可能会变得非常大。

与直觉相反,对数据库进行多次往返(使用批处理来缓解 N + 1)问题,然后使用 ORM 在内存中加入父子关系实际上可以更有效。

感谢https://whosebug.com/users/1025118/vlad-mihalcea for many pointers on this topic across the web, in particular this article on his blog - https://whosebug.com/users/1025118/vlad-mihalcea