我有需要在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而不是放入列表的任何其他解决方案。

最佳答案

toArray()返回一个Object数组。您需要的是一系列标准。因此正确的方法是:

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);

08-18 12:25