我有一些 boolean 值,基于这些 boolean 值,我需要在 CriteriaQuery
中包含一个 Predicate
。但是,给定示例 1 中的方法不起作用,因为对函数 where()
的第二次调用将覆盖任何先前的属性。这意味着只有最后一个 Predicate
将被执行。
通常您会堆叠谓词
,如示例 2 所示。
但是,由于 boolean 值给出的条件,这是不可能的。我试图防止出现示例 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(...)); }
(...)
最佳答案
您可以将它们收集在一个列表中,然后在末尾设置 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()]));
...
关于Java JPA : conditional predicates, 如何根据 boolean 值省略一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14649636/