我有一些布尔值,根据这些布尔值,我需要在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(...)); }
(...)
答案 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()]));
...