我有一个在SQL中可以正常运行的查询,但我似乎无法在JPA中创建等效查询。 CriteriaBuilder“或”似乎没有执行“或”。
这些是表格...
Table A
id : Long : primary key
b_id : Long : foreign key to id of Table B
c_id : Long : foreign key to id of Table C
Table B
id: Long : primary key
loc_id: Long
Table C
id: Long : primary key
d_id : Long : foreign key to id of Table D
Table D
id: Long : primary key
loc_id: Long
这是表中的数据(按列出的字段的顺序... ...
Table A:
1, 1, null
2, 2, null
3, null, 1
Table B:
1, 5
2, 6
Table C:
1, 1
Table D:
1, 5
并且我的sql查询通过外键在表B或表D中找到表A中loc_id为5的所有记录。 (2个结果-行ID 1和行ID 3)
select * from A
LEFT JOIN B on B.id = a.b_id
LEFT JOIN C on C.id = a.c_id
LEFT JOIN D on D.id = c.d_id
WHERE B.loc_id = 5 or D.loc_id = 5
然而,我在JPA中努力编写相同的结果。我在下面尝试过创建2个谓词,当分别执行这些谓词时都会找到1条记录,但是当我“或”它们时,它们会产生0条记录。怎么会这样呢?
EntityManager em = getEntityManager();
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery cq = cb.createQuery();
Root<A> rt = cq.from(A.class);
List<Predicate> predicates = new ArrayList<>();
Join<B, A> join1 = rt.join("b_id", JoinType.INNER);
Join<C, A> join2 = rt.join("c_id", JoinType.INNER);
Join<D, C> join3 = join2.join("d_id", JoinType.INNER);
predicates.add(cb.or(cb.equal(join1.get("loc_id"), 5), cb.equal(join3.get("loc_id"), 5)));
CriteriaQuery x = cq.select(rt).where(predicates.toArray(new Predicate[predicates.size()]));
Query q = em.createQuery(x);
List<A> = q.getResultList();
感谢所有建议,谢谢....
这里是解决方法
EntityManager em = getEntityManager();
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<A> cq = cb.createQuery(A.class);
Root<A> rt = cq.from(A.class);
Join<B, A> joinB = rt.join("b_id", JoinType.LEFT);
Join<C, A> joinC = rt.join("c_id", JoinType.LEFT);
Join<D, C> joinD = joinC.join("d_id", JoinType.LEFT);
Predicate bPredicate = cb.equal(joinB.get("loc_id"), 5);
Predicate dPredicate = cb.equal(joinD.get("loc_id"), 5);
Predicate predicate = cb.or(bPredicate, dPredicate);
CriteriaQuery<A> x = cq.select(rt).where(predicate);
TypedQuery<A> q = em.createQuery(x);
List<A> result = q.getResultList();