Java JPA:条件谓词,如何根据布尔值省略一个

时间:2013-02-01 15:30:49

标签: java jpa

我有一些布尔值,根据这些布尔值,我需要在Predicate中包含CriteriaQuery。但是,给定示例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(...)); }
(...)

1 个答案:

答案 0 :(得分:4)

您可以在列表中收集它们,然后在最后设置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()]));
...