Hibernate查询结果无法强制转换为List <subject>

时间:2015-12-09 12:54:33

标签: java hibernate casting hql

    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..
    } 

但它给了我相同的结果。

所以希望你们让我清楚。提前谢谢。

3 个答案:

答案 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();