【问题标题】:Collection fetch join集合获取连接
【发布时间】:2012-02-19 07:49:47
【问题描述】:

假设我有一个 JPA 实体和一个查询:

@Entity
public class MyEntity {

    @OneToMany(fetch = FetchType.LAZY)
    private List<ChildEntity> children = new ArrayList<ChildEntity>();
}


public List<MyEntity> fetchAll() {
    return em.createQuery("select distinct e from MyEntity e join fetch e.children")
            .getResultList();
}

如果没有 distinct 关键字,它将做 MyEntity 和 e.children 的叉积。

同时使用 distinct 和 join fetch 来避免集合的 N+1 Select 问题是否被认为是一种好习惯?有副作用吗?

【问题讨论】:

    标签: java hibernate jpa architecture


    【解决方案1】:

    您必须使用“SELECT DISTINCT”,因为正在执行 MyEntity 和孩子之间的笛卡尔积。

    对不起我的英语

    【讨论】:

      【解决方案2】:

      内部连接不应该解决问题吗?

      public List<MyEntity> fetchAll() {
          return em.createQuery("select e from MyEntity e inner join fetch e.children")
                  .getResultList();
      }
      

      【讨论】:

      • 不,结果相同。假设我有 2 个 MyEntities,每个有 2 个孩子。此查询返回 4 个 MyEntities,但我只需要 2 个。
      猜你喜欢
      • 2011-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多