JPA条件构建器多个联接的问题

时间:2018-09-20 12:26:44

标签: jpa multiple-join-rows

我有一张带2个外键的表。我需要创建一个查询,以汇总使用两个外键的结果。

即表A“ b_id”是表B“ id”的外键, 表A“ c_id”是表C“ id”的外键 123是我要查询的变量ID

我可以成功找到1个结果,其中id = 123如下所示加入表B ...

EntityManager em = getEntityManager();
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery cq = cb.createQuery();
Root<A> rt = cq.from(A.class);
List<Predicate> predList = new ArrayList<>();

Join<A, B> joinB = rt.join("b_id", JoinType.INNER);
Predicate p1 = cb.equal(joinB.get("id"),123);
predList.add(p1); 

cq.select(rt).where(predList.toArray(new Predicate[predList.size()]));
Query q = em.createQuery(cq);

...,我可以成功找到1个结果,其中id = 123如下所示加入表C ...

EntityManager em = getEntityManager();
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery cq = cb.createQuery();
Root<A> rt = cq.from(A.class);
List<Predicate> predList = new ArrayList<>();

Join<A, C> joinC = rt.join("c_id", JoinType.INNER);
Predicate p1 = cb.equal(joinC.get("id"),123);
predList.add(p1); 

cq.select(rt).where(predList.toArray(new Predicate[predList.size()]));
Query q = em.createQuery(cq);

因此,我想在一个查询中同时获得两个结果,因此我需要按以下方式“或”两个谓词,但它不起作用?

EntityManager em = getEntityManager();
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery cq = cb.createQuery();
Root<A> rt = cq.from(A.class);

List<Predicate> predList = new ArrayList<>();

Join<A, B> joinB = rt.join("b_id", JoinType.INNER);
Join<A, C> joinC = rt.join("c_id", JoinType.INNER);
Predicate p1 = cb.equal(joinB.get("id"),123);
Predicate p2 = cb.equal(joinC.get("id"),123);
predList.add(cb.or(p1, p2)); 

cq.select(rt).where(predList.toArray(new Predicate[predList.size()]));
Query q = em.createQuery(cq);

请问我在做什么错? 谢谢...

当我应用Twister建议的更改时,此查询生成的SQL是(省略了多余的字段)

SELECT t1.my_id FROM e t3, d t2, a t1, c t0 WHERE (((t1.my_id = 123) OR (t3.my_id = 123)) AND (((t0.id = t1.id) AND (t2.id = t0.id)) AND (t3.id = t2._id)))

1 个答案:

答案 0 :(得分:0)

CriteriaQuery的where(Predicate ...限制)函数对所有限制都使用运算符'AND'。

如果您要对两个谓词使用“或”,则可以尝试以下操作:

cq.select(rt).where(cb.or(predList.toArray(new Predicate[0])));
相关问题