java - Hibernate能否映射a的结果集 1 :M join in a subselect to a parent with a child collection?

标签 java hibernate jpa orm resultset

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

我正在使用 Hibernate,并在我的“父”实体上放置了一个 @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 将结果集左侧的列“折叠”为单个父对象,并将每行中的剩余列合并为“子”的许多实例,这些实例将添加到列表中家长?

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

最佳答案

这可以使用 JPQL(或 HQL,如果您使用 Hibernate)和“join fetch”命令来实现:

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

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

与直觉相反,对数据库进行多次往返(使用批处理来缓解 N + 1)问题,然后使用 ORM 将父级和子级连接到内存中实际上会更有效。

感谢https://stackoverflow.com/users/1025118/vlad-mihalcea网络上有关此主题的许多指示,特别是他博客上的这篇文章 - https://stackoverflow.com/users/1025118/vlad-mihalcea

关于java - Hibernate能否映射a的结果集 1 :M join in a subselect to a parent with a child collection?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61067833/

相关文章:

java - 在运行时根据输入从属性文件中获取值 - java Spring

java - Retrofit.Callback 的 success() 和 failure() 在同一个 Activity 中有两个接口(interface)实现的情况下

java - Hudson 使用错误的用户名创建文件

java - 创建巨大的 XML 时出现内存不足错误

hibernate - 仅 Java EE Hibernate 插入 ?我的 postgresql 数据库中的值

java - 在插入子实体之前更新父实体

spring - 使用 Spring 数据 JPA 获取随机记录

java - JPA 将 Java Double 映射到 SQL Number 列

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

java - 如何在部署级别的 JPA persistence.xml 中指定不同数量的持久性单元