簡體   English   中英

結合 JPA 和/或條件謂詞

[英]Combining JPA And/Or Criteria Predicates

我想查詢如下: (sku = 'A' AND uom_code = 'B') OR (sku = C' AND uom_code = 'D')

但我的謂詞生成例如(sku = 'A' AND uom_code = 'B' OR sku = 'C' AND uom_code = 'D')

如何修復它。 謝謝你。

public class VariantSpecification implements Specification<VariantModel> {

private final VariantFilter filter;

public VariantSpecification(VariantFilter filter) {
    this.filter = filter;
}

@Override
public Predicate toPredicate(
    Root<VariantModel> root,
    CriteriaQuery<?> query,
    CriteriaBuilder cb
) {
    final List<Predicate> predicates = new ArrayList<>();

    if (filter.getMerchantId() != null) {
        predicates.add(cb.equal(root.get("merchantId"), filter.getMerchantId()));
    }

    Predicate predicate = cb.and(predicates.toArray(new Predicate[0]));

    List<Predicate> predicatesMap = new ArrayList<>();
    if (!CollectionUtils.isEmpty(filter.getSkusUoms())) {
        filter.getSkusUoms().forEach(pair -> {
            String sku = pair.getLeft();
            String uom = pair.getRight();
            Predicate predicateSku = cb.equal(root.get("sku"), sku);
            Predicate predicateUom = cb.equal(root.get("uomCode"), uom);
            predicatesMap.add(cb.or(cb.and(predicateSku, predicateUom)));
        });
    }
 
    if (!predicatesMap.isEmpty()) {
        Predicate predicateSector = cb.or(predicatesMap.toArray(new Predicate[0]));
        return cb.and(predicate, predicateSector);
    }
    return predicate;
}

}

是的,我的錯誤,

SELECT ... FROM ... WHERE (expression1 AND expression2) OR (expression3 AND expression4)



SELECT ... FROM ... WHERE expression1 AND expression2 OR expression3 AND expression4



According to the SQL specification, both statements mean the same thing. It doesn't matter whether the statement contains the () or not, so Hibernate doesn't use them. The order of precedence is like this, similar to 1+2*3 is the same as 1+(2*3).

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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