![](/img/trans.png)
[英]How to apply a criteria builder together with an arraylist in JPA?
[英]JPA Criteria builder How to group logical AND conditions
JPA Criteria builder 如何對邏輯運算符 AND 進行分組
當前的
select * from Offers marketingo0_ where (upper(marketingo0_.SOURCE_KEY_UID)=? OR marketingo0_.STATUS=? and marketingo0_.STATUS=? )
預期的
select * from Offers marketingo0_ where upper(marketingo0_.SOURCE_KEY_UID)=? 或(marketingo0_.STATUS=? 和 marketingo0_.STATUS=? )
List<Predicate> innerPredicates = new ArrayList<Predicate>();
List<Predicate> predicates = new ArrayList<Predicate>();
List<Predicate> outerPredicates = new ArrayList<Predicate>();
//Create all outer predicates
createPredicates(filter.getRootBooleanClause(),builder, marketingOffer, outerPredicates);
//Create all sub clauses predicates
for (BooleanClause subClause : filter.getRootBooleanClause().getSubClauses()) {
List<Predicate> groupPredicates = new ArrayList<Predicate>();
createPredicates(subClause,builder, marketingOffer, groupPredicates);
if(groupPredicates!=null && groupPredicates.size()>0 && filter.getOperator().equals(LogicOperator.OR)){
innerPredicates.add(builder.and(groupPredicates.toArray(new Predicate[groupPredicates.size()])));
}else if(groupPredicates!=null && groupPredicates.size()>0 && filter.getRootBooleanClause().getOperator().equals(LogicOperator.AND)){
innerPredicates.add(builder.or(groupPredicates.toArray(new Predicate[groupPredicates.size()])));
}
}
if(innerPredicates.size()>0){
outerPredicates.addAll(innerPredicates);
}
if(outerPredicates.size()>0 && filter.getRootBooleanClause().getOperator().equals(LogicOperator.OR)){
predicates.add(builder.or(outerPredicates.toArray(new Predicate[outerPredicates.size()])));
}else if(outerPredicates.size()>0 && filter.getRootBooleanClause().getOperator().equals(LogicOperator.AND)){
predicates.add(builder.and(outerPredicates.toArray(new Predicate[outerPredicates.size()])));
}
像這樣嘗試:
builder.or(
builder.and(
<Column1 predicate>,
<Column2 predicate>
),
<ColumnC predicate>
);
CriteriaBuilder
將負責正確嵌套子表達式。
達到
upper(marketingo0_.SOURCE_KEY_UID)=?
OR
(marketingo0_.STATUS=? and marketingo0_.STATUS=? )
我認為這應該有效
criteriaBuilder.or(
criteriaBuilder.equal(criteriaBuilder.upper(root.<String>get("SOURCE_KEY_UID")), key),
criteriaBuilder.and(
criteriaBuilder.equal(root.get("STATUS"), status),
criteriaBuilder.equal(root.get("STATUS"), status) // This doesnot make sense but sticking to OP
)
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.