繁体   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