将“标准”列入“OR”条件列表

时间:2014-07-17 11:48:05

标签: java hibernate orm hibernate-criteria

我需要在Criterion条件下使用or。这个Criterion将在循环中创建。所以我将Criterion添加到List。在循环之外,我将这些Criterion添加到Criteria中,并将列表(包含Criterion)强制转换为Criterion[]数组。

List<Criterion> criterions = new ArrayList<Criterion>();
        for (XYZ xyz : xyzs) {

            Integer[] age = findMinAndMaxAgeXYZ(xyz);

            Date minAge = prepareDateByAge(age[0]);
            Date maxAge = prepareDateByAge(age[1]);
            // Ordering has been changed to fetch the records for 
            // between condition.
            criterions.add(Restrictions.between("dob", maxAge, minAge));
        }
        criteria.add(Restrictions.or((Criterion[]) criterions.toArray()));  

但它给了我异常

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Lorg.hibernate.criterion.Criterion;  

Criterion添加为or而非放入列表的任何其他解决方案。

1 个答案:

答案 0 :(得分:2)

toArray()返回一个Object数组。你需要的是一系列Criterion。所以正确的方法是:

Criterion[] array = criterions.toArray(new Criterion[criterions.size()]);

查看toArray()toArray(T[])

之间的不同返回类型

请注意,在这种情况下,简单地使用析取会更容易:

Disjunction disjunction = Restrictions.disjunction();
for (XYZ xyz : xyzs) {
    ...
    disjunction.add(Restrictions.between("dob", maxAge, minAge));
}
criteria.add(disjunction);