我有需要在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);