我有需要使用Criterion
作为或
条件的要求。此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()));
但这给了我异常(exception)
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Lorg.hibernate.criterion.Criterion;
将Criterion
添加为或
而不是放入列表的任何其他解决方案。
最佳答案
toArray()
返回一个对象数组。您需要的是一系列标准。所以正确的方法是:
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);
关于java - 将条件放入 'OR' 条件的列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24802680/