我有一些布尔值,基于这些布尔值,我需要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(...)); }
(...)