我正在尝试使用Criteria API,而不是将查询构建为JPQL Strings,因为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()]));
NB。我在构造Query对象或指定Root或Joins时没有任何问题。我只是遇到上述查询的特殊性问题。为了清楚起见,假设所有属性都是String,并且不需要任何连接。
答案 0 :(得分:7)
表达式CriteriaQuery<T> where(Predicate... restrictions)
,正如您在javadoc中看到的那样,
根据指定的限制谓词的组合修改查询以限制查询结果。
因此,它将谓词连接在列表中,即它将它们与AND
表达式连接起来。要将它们与OR
表达式连接起来,只需使用CriteriaBuilder#or(Predicate... restrictions)
query.where(builder.or(predicates.toArray(new Predicate[] {})));