Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaJPA:条件谓词,如何根据布尔值省略一个_Java_Jpa - Fatal编程技术网

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()]);
...

哦,好的,那么数组实际上与我在函数中发布多个对象的数组相同吗?我不知道。。。我一直在阅读文档,但找不到关于允许列表的任何信息,但这将给出相同的结果。是的!在任何有“最终参数可以作为数组或参数序列传递”的地方:)哦,好的,那么数组实际上与我在函数中发布多个对象的数组是一样的?我不知道。。。我一直在阅读文档,但找不到关于允许列表的任何信息,但这将给出相同的结果。是的!“最终参数可以作为数组或参数序列传递”: