我需要在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
而非放入列表的任何其他解决方案。
答案 0 :(得分:2)
toArray()
返回一个Object数组。你需要的是一系列Criterion。所以正确的方法是:
Criterion[] array = criterions.toArray(new Criterion[criterions.size()]);
之间的不同返回类型
请注意,在这种情况下,简单地使用析取会更容易:
Disjunction disjunction = Restrictions.disjunction();
for (XYZ xyz : xyzs) {
...
disjunction.add(Restrictions.between("dob", maxAge, minAge));
}
criteria.add(disjunction);