簡體   English   中英

JPA Criteria builder 如何對邏輯 AND 條件進行分組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM