我在使用Conjunction
s 和Disjunction
s 时遇到问题。我的程序从 ui 接收任意数量的过滤器元素(每个表示 a Criterion
),并打算将它们链接在一起作为AND
or OR
。
因此,例如,我可以有 3 个这样的元素(我Criterion
用字母表示 a):
a OR b AND c
我的代码如下所示:
// ...
Criteria rootCriteria = createCriteria(entityClass);
Conjunction conjunction = Restrictions.conjunction();
Disjunction disjunction = Restrictions.disjunction();
boolean isFirst = true;
for (InternalFilterElement element : elements) {
if (isFirst) {
isFirst = false;
rootCriteria.add(createCriterion(element.getFilterRelation(), element.getValue()));
} else if (InternalFilterOperand.AND.equals(element.getInternalFilterOperand())) {
addCriterionToJunction(conjunction, element);
} else {
addCriterionToJunction(disjunction, element);
}
}
rootCriteria.add(disjunction);
rootCriteria.add(conjunction);
// ...
我的问题是我总是得到a AND b AND c
一些不必要的括号。
我真正想知道的是我是否使用了错误的工具来完成这项任务?我如何混合AND
和OR
运营商?
编辑
InternalFilterOperand
基本上是一个enum
包含OR
和AND
addCriterionToJunction
只需根据关系 (<, >, ...) 和值添加 aCriterion
即可。Junction
它没有任何副作用。