我在使用Conjunctions 和Disjunctions 时遇到问题。我的程序从 ui 接收任意数量的过滤器元素(每个表示 a Criterion),并打算将它们链接在一起作为ANDor 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它没有任何副作用。