【问题标题】:How to generate a predicate array of OR statements如何生成 OR 语句的谓词数组
【发布时间】:2013-08-14 08:32:59
【问题描述】:

我正在尝试使用 Criteria API 而不是将查询构造为 JPQL 字符串,因为 Criteria API 似乎更适合于此。但是,我在理解如何构造以下两个语句时遇到了一些问题。

SELECT e 
FROM Subject e 
WHERE e.company = :c1 
OR e.company = :c2 
OR e.company = :c3

在这种情况下,我需要遍历未知数量的值(c1、c2、c3 等)以匹配相同的属性。

SELECT e 
FROM Subject e 
WHERE e.company 
LIKE :c1 
OR e.account 
LIKE :c1 
OR e.email 
LIKE :c1

在这种情况下,我需要传入单个值 (c1) 并对特定范围的属性进行“LIKE”比较。

我当前的模式看起来像这样:

// Criteria
CriteriaBuilder builder = subjectDAO.criteriaBuilder();
CriteriaQuery<Subject> query = builder.createQuery(Subject.class);

// Root
Root<Subject> subject = query.from(Subject.class);

List<Predicate> predicates = new ArrayList();

for (String property : map.keySet()) {
    String value = (String) coreFilter.get(map);
    predicates.add(????? This is where I come unstuck ?????);
}

// pass all the predicates into the query
query.where(predicates.toArray(new Predicate[predicates.size()]));

注意。我在构造 Query 对象或指定 Root 或 Joins 时没有任何问题。我只是对上述查询的特殊性有疑问。为了清楚起见,假设所有属性都是字符串并且不需要任何连接。

【问题讨论】:

    标签: jpa criteria-api


    【解决方案1】:

    表达式CriteriaQuery&lt;T&gt; where(Predicate... restrictions),你可以在javadoc中看到,

    修改查询,根据指定的限制谓词的连词来限制查询结果。

    因此,它将列表中的谓词连接起来,即将它们与AND 表达式连接起来。要将它们与OR 表达式连接,只需使用CriteriaBuilder#or(Predicate... restrictions)

    query.where(builder.or(predicates.toArray(new Predicate[] {})));
    

    【讨论】:

    • 表示如果你的map为空,最后的谓词为假,你的查询不会给出结果
    • 这和predicates.add( builder.or( builder.like(subject.get(Subject_.email), literal), builder.like(contact.get(Contact_.firstName), literal), builder.like(contact.get(Contact_.lastName) );有什么不同
    • 它们是等价的,您可以自己尝试(通过在 JPA 提供者的配置中添加一些日志来打印生成的查询)。不同之处在于,以我的方式,条件的数量可以动态变化,如果我没有误解你的问题,这就是你要问的。
    • 太棒了,所以我的基本限制是我的谓词将始终与 AND 连接。 IE。当我将 List 传递给 query.where(predicates) 时。我基本上得到的是 query.where(predicate1 AND predicate2 AND predicate3 etc.)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-11
    • 2022-01-01
    • 2014-04-01
    • 2015-08-11
    • 1970-01-01
    相关资源
    最近更新 更多