如何生成OR语句的谓词数组

tar*_*rka 3 jpa criteria-api

我试图使用Criteria API而不是像JPQL Strings一样构造查询,因为Criteria API似乎更适合这个.但是,我在理解如何构造以下两个语句时遇到了一些问题.

SELECT e 
FROM Subject e 
WHERE e.company = :c1 
OR e.company = :c2 
OR e.company = :c3
Run Code Online (Sandbox Code Playgroud)

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

SELECT e 
FROM Subject e 
WHERE e.company 
LIKE :c1 
OR e.account 
LIKE :c1 
OR e.email 
LIKE :c1
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我需要传入单个值(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()]));
Run Code Online (Sandbox Code Playgroud)

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

per*_*ssf 8

CriteriaQuery<T> where(Predicate... restrictions)你可以在javadoc中看到这个表达式,

修改查询以根据指定的限制谓词的组合限制查询结果.

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

query.where(builder.or(predicates.toArray(new Predicate[] {})));
Run Code Online (Sandbox Code Playgroud)