【问题标题】:How to join fetch an attribute of element in collection with QueryDSL JPA如何使用QueryDSL JPA加入获取集合中元素的属性
【发布时间】:2020-05-28 03:53:07
【问题描述】:

实体如下:

class A {
    Long id;

    @ManyToMany
    @JoinTable(name = "rel_a_b", joinColumns = @JoinColumn(name = "a_id"), inverseJoinColumns = @JoinColumn(name = "b_id"))
    Set<B> bSet;
}

class B {
    Long id;

    @ManyToMany(mappedBy = "bSet")
    Set<A> aSet;

    @ManyToMany
    @JoinTable(name = "rel_b_c", joinColumns = @JoinColumn(name = "b_id"), inverseJoinColumns = @JoinColumn(name = "c_id"))
    Set<C> cSet;
}

class C {
    Long id;

    @ManyToMany(mappedBy = "cSet")
    Set<B> bSet;
}

我需要选择A 实体并加入B 实体中的提取bSetcSet。使用JPA Criteria,代码如下:

    final Fetch<A, B> bSetFetch = rootA.fetch("bSet", JoinType.LEFT);
    bSetFetch.fetch("cSet", JoinType.LEFT);

工作正常,但我无法使用 QueryDSL 实现这一点。我试过了

    final QA a = QA.a;
    jpaQuery
    .from(a)
    .leftJoin(a.bSet, QB.b).fetchJoin()
    .leftJoin(QB.b.cSet).fetchJoin()
    .select(a)

但它会抛出异常

query specified join fetching, but the owner of the fetched association was not present in the select list [FromElement{explicit,not a collection join,fetch join,fetch non-lazy properties,classAlias=b,role=A.b,tableName=`b`,tableAlias=b4_,origin=a a2_,columns={a2_.id ,className=B}}] [select a
from A a
  left join fetch a.bSet as b
  left join fetch b.cSet]]

,如果没有fetchJoin(),则结果不包括bSetcSet。谁能解决这个问题?

【问题讨论】:

    标签: jpa join many-to-many querydsl


    【解决方案1】:

    从 QueryDSL 的角度来看,获取连接是正确应用的。我们也可以从生成的 JPQL 查询看起来正确这一事实中观察到这一点。

    这里的限制是,如果 fetch 关联的所有者被投射到 select 子句中,Hibernate 只允许 FETCH JOINS。 cSetB 上的关联,因此您需要投影您的 b 或省略 cSet 的 fetch 连接。例如:

    jpaQuery
        .from(a)
        .leftJoin(a.bSet, QB.b).fetchJoin()
        .leftJoin(QB.b.cSet).fetchJoin()
        .select(a, b)
    

    现在,由于bSet 的基数,这将导致a 的结果重复。这只是 Hibernate 中 fetch join 的一个限制。

    或者,您可以考虑为查询指定提取图:

    EntityGraph postGraph = em.getEntityGraph("post");
    query.setHint("javax.persistence.fetchgraph", postGraph);
    

    有关使用 EntityGraphs 的更多信息,请参阅https://www.baeldung.com/jpa-entity-graph

    【讨论】:

      猜你喜欢
      • 2021-08-03
      • 1970-01-01
      • 2020-01-10
      • 2011-07-30
      • 2016-02-19
      • 2018-10-25
      • 1970-01-01
      • 2015-03-26
      • 1970-01-01
      相关资源
      最近更新 更多