[英]How to write this join query with hibernate CRITERIA
select ptm.* from ProofTestMaster ptm LEFT JOIN
ProofTestApplicationMap ptam on ptm.proofTestID = ptam.proofTestID
LEFT JOIN ProofTestComapartmentMap ptcm on ptm.proofTestID = ptcm.proofTestID
where (ptam.applicationID = 3 and ptm.isDeleted = 0) or
(ptcm.compartmentID = 4 and ptm.isDeleted = 0)
其中ProofTestApplicationMap
和ProofTestComapartmentMap
是映射表,並且它們在Java結尾沒有實體。
最好為查詢添加適當的縮進。 優點是:
所以我為你做了。 現在查詢看起來像:
select
ptm.*
from ProofTestMaster ptm
LEFT JOIN ProofTestApplicationMap ptam on ptm.proofTestID = ptam.proofTestID
LEFT JOIN ProofTestComapartmentMap ptcm on ptm.proofTestID = ptcm.proofTestID
where
(ptam.applicationID = 3 and ptm.isDeleted = 0) or
(ptcm.compartmentID = 4 and ptm.isDeleted = 0);
現在,下面是帶有靜態元模型的CriteriaBuilder的實現:
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Long> criteriaQuery = criteriaBuilder.createQuery(Long.class);
Root<ProofTestMaster> mainRoot = criteriaQuery.from(ProofTestMaster.class);
Join<ProofTestMaster, ProofTestApplicationMap> firstJoin = mainRoot.join(ProofTestMaster_.proofTestID, JoinType.LEFT);
Join<ProofTestMaster, ProofTestComapartmentMap> secondJoin = mainRoot.join(ProofTestMaster_.proofTestID, JoinType.LEFT);
Predicate p1 = criteriaBuilder.equal(firstJoin.get(ProofTestApplicationMap_.applicationID),3);
Predicate p2 = criteriaBuilder.equal(mainRoot.get(ProofTestMaster_.isDeleted),0);
Predicate p3 = criteriaBuilder.equal(secondJoin.get(ProofTestComapartmentMap_.compartmentID), 4);
Predicate p4 = criteriaBuilder.and(p1,p2);
Predicate p5 = criteriaBuilder.and(p3,p2);
Predicate p6 = criteriaBuilder.or(p4,p5);
criteriaQuery.where(p6);
criteriaQuery.select(criteriaBuilder.count(mainRoot));
Long count = entityManager.createQuery(criteriaQuery).getSingleResult();
如果您看到上面的代碼,則總共有6個謂詞,可以將它們放入List中。 但是為了您的理解,我一直這樣保存。
讓我知道是否有幫助。 謝謝,祝您編程愉快。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.