Hibernate 在JPQL select中处理共享对象

Hibernate 在JPQL select中处理共享对象,hibernate,jpa,Hibernate,Jpa,我有一个与子实体有一对一关系的父实体。孩子身上的manytone是可选的 在对子级执行查询时,我可以对父级执行左连接获取,以在一个查询中获取所有父级。不幸的是,父实体可能会在返回的子集合中重复多次,从而增加了大量整理结果的开销 有没有一种方法可以执行此查询(a)在调用“child.getParent()”(即无左连接提取)时不必对每个父级执行单独的选择,以及(b)在执行左连接提取时不必检索每个父级的重复数据集 从逻辑上讲,我想做的是: 执行子查询(这可能会返回100个子实体) 收集父对象(这可能

我有一个与子实体有一对一关系的父实体。孩子身上的manytone是可选的

在对子级执行查询时,我可以对父级执行左连接获取,以在一个查询中获取所有父级。不幸的是,父实体可能会在返回的子集合中重复多次,从而增加了大量整理结果的开销

有没有一种方法可以执行此查询(a)在调用“child.getParent()”(即无左连接提取)时不必对每个父级执行单独的选择,以及(b)在执行左连接提取时不必检索每个父级的重复数据集

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

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

    @Entity
    public class Child ... {
        ...
        @ManyToOne( optional = true, fetch = FetchType.EAGER )
        @JoinColumn( name = "parent_id" )
        private Parent parent;
        ...
    }
    
    每次调用“child.getParent()”时,此查询都需要对父对象执行单独的选择:

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

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

    谢谢

    您是否测量了加载100个子项的查询与加载父项的查询之间的差异?您是否已经证明它会导致严重的性能问题?如果不是,那么您正在进行过早的优化。只需使用左连接获取。无论如何,我真的怀疑做两个查询会比只做一个查询花费更少的时间。是的,单独加载每个父级的查询要慢得多,以至于会影响用户。LEFT JOIN FETCH的速度要快得多,但我仍在寻找一些额外的性能提升。父实体有几个长字符串字段,这些字段的额外不必要封送是一个热点。数据封送比实际查询执行更昂贵。
    SELECT c FROM Child c LEFT JOIN FETCH c.parent WHERE c.id IN :childIds;