2

我有一些布尔值,基于这些布尔值,我需要PredicateCriteriaQuery. 但是,给定示例 1 中的方法不起作用,因为对该函数的第二次调用where()将覆盖任何先前的属性。这意味着只有最后一个Predicate会被执行。

通常你会堆叠Predicates如示例 2 中所示。

但是,由于布尔值给出的条件,这是不可能的。我试图防止出现示例 3 中的情况。有什么建议吗?

示例 1

function(boolean a, boolean b, boolean c) {
    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<Product> query = cb.createQuery(Product.class);
    Root product = query.from(Product.class);

    query.select(product);

    if(a) {
        query.where(cb.equal(...));
    }
    if(b) {
        query.where(cb.equal(...));
    }
    if(c) {
        query.where(cb.equal(...));
    }

    return em.createQuery(query).getResultList();
}

示例 2

query.where(cb.equal(...), cb.equal(...), cb.equal(...));

示例 3

if(a && b && c) { query.where(cb.equal(...), cb.equal(...), cb.equal(...)); }
if(a && b && !c) { query.where(cb.equal(...), cb.equal(...)); }
if(a && !b && c) { query.where(cb.equal(...), cb.equal(...)); }
if(a && !b && !c) { query.where(cb.equal(...)); }
(...)
4

1 回答 1

5

您可以将它们收集在一个列表中,然后在最后设置 where 子句,例如:

private final List<Predicate> predicates = new ArrayList<Predicate>(3);
...
if(a) {
    predicates.add(cb.equal(...));
}
if(b) {
    predicates.add(cb.equal(...));
}
if(c) {
    predicates.add(cb.equal(...));
}
...
query.where(predicates.toArray(new Predicate[predicates.size()]));
...
于 2013-02-01T15:53:09.920 回答