Hibernate 查询结果无法转换为列表<Subject>
Hibernate Query result cannot be cast to List<Subject>
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 并迭代它:
List<Subject> myList = new ArrayList<>();
for (final Object o : q.list()) {
myList.add((Subject) o);//error occurs here..
}
但它给了我完全相同的结果。
所以希望你们让我明白。提前致谢。
这是因为您选择的不是 Subject
而是 inner joined
列集,因此它不会给您返回 List<Subject>
而是包含 [=14= 列的列数组列表] 以及 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
}
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to pojo.Subject
at hibernm.Application.main(Application.java:39)
这意味着:您不能将 Object
的 Array
转换为 Subject
。
如果你检查 Hibernate API docs 你会发现
public List list()
throws HibernateException
Return the query results as a List. If the query contains
multiple results pre row, the results are returned in an instance of Object[].
这正是您的情况 - 您每行得到 多个结果 - 由于内部联接,每个 Subject
和一个 Student
.
我认为@Jan 所说的是正确的,但由于您只想要 Subject 的结果,我认为您可以这样做:
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();
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 并迭代它:
List<Subject> myList = new ArrayList<>();
for (final Object o : q.list()) {
myList.add((Subject) o);//error occurs here..
}
但它给了我完全相同的结果。
所以希望你们让我明白。提前致谢。
这是因为您选择的不是 Subject
而是 inner joined
列集,因此它不会给您返回 List<Subject>
而是包含 [=14= 列的列数组列表] 以及 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
}
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to pojo.Subject at hibernm.Application.main(Application.java:39)
这意味着:您不能将 Object
的 Array
转换为 Subject
。
如果你检查 Hibernate API docs 你会发现
public List list() throws HibernateException
Return the query results as a List. If the query contains multiple results pre row, the results are returned in an instance of Object[].
这正是您的情况 - 您每行得到 多个结果 - 由于内部联接,每个 Subject
和一个 Student
.
我认为@Jan 所说的是正确的,但由于您只想要 Subject 的结果,我认为您可以这样做:
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();