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)

这意味着:您不能将 ObjectArray 转换为 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();