Java JPA : conditional predicates, 如何根据 boolean 值省略一个

标签 java jpa

我有一些 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/

相关文章:

java - h :panelGrid 中具有多个子组件的自定义 Facelets 标记

java - 查找两个字符串的交集,其中返回两个字符串中出现的字符(与第一个字符串的序列顺序相同)

Java静态多态(重载)和泛型之间的继承

java - 为什么我们需要在 <persistence-unit> 元素中指定类?

mysql - 如何使用EclipseLink和Joda-Time将UTC中的日期时间存储到数据库中?

java - 如何区分ApplicationContext和Context?

java - 如何用 Android 中 url 中的图像替换文本?

java - 应用程序类(应用程序监听器)org.springframework.web.context.ContextLoaderListner 的配置错误

java - 更新版本 Hibernate Jboss Ejb 和 Java

java - 创建类路径资源中定义的名称为 'sessionRepositoryFilterRegistration' 的 bean 时出错