JavaJPA:条件谓词,如何根据布尔值省略一个
我有一些布尔值,基于这些布尔值,我需要在JavaJPA:条件谓词,如何根据布尔值省略一个,java,jpa,Java,Jpa,我有一些布尔值,基于这些布尔值,我需要在标准查询中包含一个谓词。但是,给定示例1中的方法不起作用,因为对函数where()的第二次调用将覆盖任何以前的属性。这意味着只执行最后一个谓词 通常,您将堆叠谓词,如示例2中所示 然而,由于布尔人给出的条件,这是不可能的。我试图防止出现如例3所示的情况。有什么建议吗 示例1 function(boolean a, boolean b, boolean c) { CriteriaBuilder cb = em.getCriteriaBuilder()
标准查询
中包含一个谓词
。但是,给定示例1中的方法不起作用,因为对函数where()
的第二次调用将覆盖任何以前的属性。这意味着只执行最后一个谓词
通常,您将堆叠谓词
,如示例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();
}
示例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()]));
...
private final List谓词=新的ArrayList(3);
...
如果(a){
谓词.add(cb.equal(…);
}
如果(b){
谓词.add(cb.equal(…);
}
如果(c){
谓词.add(cb.equal(…);
}
...
where(predicates.toArray(新谓词[predicates.size()]);
...
您可以在列表中收集它们,然后在末尾设置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()]));
...
private final List谓词=新的ArrayList(3);
...
如果(a){
谓词.add(cb.equal(…);
}
如果(b){
谓词.add(cb.equal(…);
}
如果(c){
谓词.add(cb.equal(…);
}
...
where(predicates.toArray(新谓词[predicates.size()]);
...
哦,好的,那么数组实际上与我在函数中发布多个对象的数组相同吗?我不知道。。。我一直在阅读文档,但找不到关于允许列表的任何信息,但这将给出相同的结果。是的!在任何有“最终参数可以作为数组或参数序列传递”的地方:)哦,好的,那么数组实际上与我在函数中发布多个对象的数组是一样的?我不知道。。。我一直在阅读文档,但找不到关于允许列表的任何信息,但这将给出相同的结果。是的!“最终参数可以作为数组或参数序列传递”: