处理JPQL选择中的共享对象

时间:2014-01-09 18:18:58

标签: hibernate jpa

我有一个与子实体具有OneToMany关系的Parent实体。孩子的ManyToOne是可选的。

在对Child执行查询时,我可以在父项上执行LEFT JOIN FETCH,以在一个查询中获取所有父项。不幸的是,父实体可能会在返回的子集中多次复制,从而增加了大量开销,并对结果进行了编组。

当我调用“child.getParent()”(即没有LEFT JOIN FETCH)和(b)没有检索重复集时,是否有办法执行此查询(a)而不必对每个父进行单独选择如果我做LEFT JOIN FETCH,那么每个父母的数据是什么?

从逻辑上讲,我想做的是:

  1. 执行子查询(这可能会返回100个子实体)
  2. 收集父对象(这可能只返回50个父实体)
  3. 设置每个孩子以引用其检索到的父母。
  4. 如果这个不清楚,你需要一些代码,我可以提供。但这是一个非常基本的例子:

    @Entity
    public class Child ... {
        ...
        @ManyToOne( optional = true, fetch = FetchType.EAGER )
        @JoinColumn( name = "parent_id" )
        private Parent parent;
        ...
    }
    

    每次我调用“child.getParent()”时,此查询都需要对父进行单独选择:

    SELECT c FROM Child c WHERE c.id IN :childIds;
    

    此查询将为结果集中不唯一的每个父项加载重复数据:

    SELECT c FROM Child c LEFT JOIN FETCH c.parent WHERE c.id IN :childIds;
    

    谢谢!

0 个答案:

没有答案