如何使用QueryDSL JPA连接获取集合中元素的属性

问题描述 投票:0回答:1

实体如下:

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实体,并在bSet实体中加入提取cSetB。使用JPA标准,代码如下:

    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个回答
0
投票
从QueryDSL的角度正确应用了提取联接。我们还可以从产生的JPQL查询看起来正确这一事实观察到这一点。
© www.soinside.com 2019 - 2024. All rights reserved.