QueryDSL 加入具有单向关系的多个实体
QueryDSL join on multiple entities with one way relationships
我有一些类似于以下的实体(伪代码)
class A {
Integer aId;
}
class B {
Integer bId;
@ManyToOne
A a;
}
class C {
Integer cId;
@ManyToOne
A a;
}
我想使用 QueryDSL 根据 C 中的条件获取 B 的列表。我不想在 A 中创建一组 B 或一组 C。
如果我这样做
query.from(b, c).innerJoin(b.a, a).fetch().innerJoin(c.a, a).
where(c.cId.eq(1)).list(b);
然后,正如预期的那样,我得到了一个交叉连接。
如果我这样做
query.from(b).innerJoin(b.a, a).fetch().innerJoin(c.a, a).
where(c.cId.eq(1)).list(b);
然后,如预期的那样,我收到 "Undeclared path" 错误。
我可以
query.from(b, c).innerJoin(b.a, a).fetch().innerJoin(c.a, a).
where(c.cId.eq(1)).where(c.a.aId.eq(a.aId).list(b);
这会保留交叉连接,但会根据 where 子句限制结果。我想知道是否有没有交叉连接的方法来做到这一点。
如果不更改实体类型,您将需要使用交叉联接来连接查询中的实体。
我有一些类似于以下的实体(伪代码)
class A {
Integer aId;
}
class B {
Integer bId;
@ManyToOne
A a;
}
class C {
Integer cId;
@ManyToOne
A a;
}
我想使用 QueryDSL 根据 C 中的条件获取 B 的列表。我不想在 A 中创建一组 B 或一组 C。
如果我这样做
query.from(b, c).innerJoin(b.a, a).fetch().innerJoin(c.a, a).
where(c.cId.eq(1)).list(b);
然后,正如预期的那样,我得到了一个交叉连接。
如果我这样做
query.from(b).innerJoin(b.a, a).fetch().innerJoin(c.a, a).
where(c.cId.eq(1)).list(b);
然后,如预期的那样,我收到 "Undeclared path" 错误。
我可以
query.from(b, c).innerJoin(b.a, a).fetch().innerJoin(c.a, a).
where(c.cId.eq(1)).where(c.a.aId.eq(a.aId).list(b);
这会保留交叉连接,但会根据 where 子句限制结果。我想知道是否有没有交叉连接的方法来做到这一点。
如果不更改实体类型,您将需要使用交叉联接来连接查询中的实体。