Session s = ...;
String query = "from pojo.Subject sub inner join sub.students stu group by "
+ "stu.FName having count(sub.subName) > 1";
Query q = s.createQuery(query);
List<Subject> list = q.list();
for (Subject subj : list) {//error occurs here..
System.out.println(subj.getSubName()+" - "+subj.getDay());
}
它给了我一个错误:
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to pojo.Subject
at hibernm.Application.main(Application.java:39)
我知道我可以通过以下方式检索数据:
for (int i = 0; i < list.size(); i++) {
Object get = list.get(i);
System.out.println(get);
}
但它对我来说似乎并不合适。 所以我尝试引入另一个列表并迭代它:
List<Subject> myList = new ArrayList<>();
for (final Object o : q.list()) {
myList.add((Subject) o);//error occurs here..
}
但它给了我相同的结果。
所以希望你们让我清楚。提前谢谢。
答案 0 :(得分:2)
这是因为您选择的不是Subject
而是inner joined
列集,因此它不会返回List<Subject>
而是返回包含Student
列的列数组列表以及Student
,可能是List<Object[]>
因此,为了处理您的查询结果,您可能会喜欢(或尝试通过调试来检查查询结果):
Query query = session.createQuery(query);
List<Object[]> listResult = query.list();
for (Object[] aRow : listResult) {
Subject subject = (Subject) aRow[0];
Student student = (Student) aRow[1];
//do your code
}
答案 1 :(得分:1)
线程“main”中的异常java.lang.ClassCastException:[Ljava.lang.Object;不能投到pojo.Subject 在hibernm.Application.main(Application.java:39)
这转换为:您无法将Array
Object
投射到Subject
。
如果你检查Hibernate API docs,你会发现
public List list() throws HibernateException
将查询结果作为List返回。如果查询包含 前置的多个结果,结果在Object []的实例中返回。
在您的案例中恰恰发生了这种情况 - 由于内部联接,您获得每行多个结果 - 一个Subject
和一个Student
。
答案 2 :(得分:-1)
我认为@Jan所说的是真的,但既然你只想要主题的结果,我想你可以这样做:
String query = "Select sub from pojo.Subject sub inner join sub.students stu group by "
+ "stu.FName having count(sub.subName) > 1";
并且
Query q = s.createQuery(query, Subject.class);
List<Subject> list = q.getResultList();