Hibernate使用或运算符和动态限制从List <criteria>构建查询

时间:2015-12-09 23:14:53

标签: java spring hibernate restrictions criterion

我有一个按照某些条件以编程方式提供的List,代码如下所示:

 List<Criterion> restrictionList = new ArrayList<Criterion>();
 for(int i = 1; i<someconditions.length);i++){          
        if( condition1){
           restrictionList.add(...);
        } else if(condition2){                      
           restrictionList.add(...)
        } else if(condition3){
            restrictionList.add(...)                
        }                   
    }       

在构建Criteria时,我做到了这一点:

for (int c = 0; c < restrictionList.size()-1;c++){
    crit.add(Restrictions.or(restrictionList.get(c),restrictionList.get(c+1)));
}

查询字符串中的where子句显示:

((A或B)AND(B或C))

因为在build子句中有一个And,一些结果没有显示

我们说我有记录R1,R2和R3

R1符合条件A和C. R2符合条件A. R3符合条件B和C

因此(A或B)具有R1,R2和R3 (B或C)具有R1和R3

由于两个条件都由AND绑定,因此R2被排除在最终结果之外

如何使where子句看起来像:

(A或B或C)

因此,当记录满足至少一个条件时,可以显示记录

感谢。

1 个答案:

答案 0 :(得分:3)

if (!restrictionList.isEmpty()) {
    crit.add(or(restrictionList));
}

private Disjunction or(List<Criterion> restrictions) {
    Disjunction result = Restrictions.disjunction();

    for(Criterion restriction : restrictions) {
        result.add(restriction);
    }

    return result;
}