标准生成器的where
方法
根据指定的限制 predicate 的合取来限制查询结果
换句话说,用AND连接所有 predicate 。我以这种方式将 predicate 列表传递给此方法:
criteria.where(preds.toArray(new Predicate[0]));
结果查询如下所示:
... where p1 and p2 and p3
但是我需要的是
... where p1 and p2 or p3
我尝试使用两个 predicate 列表,一个用于“AND”,另一个用于“ORS”:
if(preds.isEmpty() && !orPreds.isEmpty()) {
criteria.where(cb.or(orPreds.toArray(new Predicate[orPreds.size()])));
}
else if(!preds.isEmpty() && !orPreds.isEmpty()) {
criteria.where(cb.and(preds.toArray(new Predicate[preds.size()])),
cb.or(orPreds.toArray(new Predicate[orPreds.size()])));
}
else {
criteria.where(preds.toArray(new Predicate[0]));
}
但结果查询是相同的:
... where p1 and p2 and p3
你知道吗?
2条答案
按热度按时间rxztt3cl1#
只需使用
CriteriaBuilder.and(Predicate... restrictions)
和CriteriaBuilder.or(Predicate... restrictions)
将 predicate 数组合并为简单 predicate用于获取
where (p1 and p2) or p3
,其中p1
、p2
和p3
都是与and
语句连接的 predicate 数组:要获取
where p1 and (p2 or p3)
:最后,如果要通过将 predicate 数组与
or
语句连接来构建单个 predicate ,请使用以下代码:tpgth1q72#
默认情况下,所有 predicate 都被理解为“AND”。
您可以使用cb.和/ cb.or(如果需要,可以嵌套)“播放” predicate 以增加其复杂性
您可以创建如下列表:
如果需要,也可以使用多选(如果要处理子查询的结果,请在此添加它们)
添加多选后,您可能需要orderBy。您可以遵循相同的概念,但使用表达式列表