无法强制转换迭代器对象

时间:2013-11-19 11:09:09

标签: java iterator hql classcastexception named-query

我编写了这段代码来将迭代器对象强制转换为预定义的对象,但它失败并引发了类强制转换异常:

public ArrayList<Session> getAllSessions() {

    ArrayList<Session> sessions = new ArrayList<Session>();
    Query sessionsQuery = null;
    sessionsQuery = this.getSession().getNamedQuery("getAllSessions");
    Iterator trainees = sessionsQuery.list().iterator();

    while (trainees.hasNext()) {
        sessions.add((Session) trainees.next());
    }
    return sessions;

}


java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to Session

查询:

<sql-query name="getAllSessions"><![CDATA[ select ss.ID,ss.NAME from SESSION_ ss where ss.ISDELETED<>1]]></sql-query>

这里有什么问题?

3 个答案:

答案 0 :(得分:0)

您的问题的最佳解决方案可能会减少您的代码

return sessionsQuery.list();

在上面的问题中,您使用迭代器迭代列表并再次存储到ArrayList中,不必要地创建对象

而是从上面的代码中返回该列表。

看到你的名字查询后,我发现它会给你

   List<Object[]> 

因为您已经传递了选择运算符的投影

相反,您可以将查询设为

      Select sess from SESSION sess where 'your condition what you want'

答案 1 :(得分:0)

如果你看一下Query#list()(强调我的)

的文档
  

将查询结果作为List返回。如果查询在前一行包含多个结果,则结果将在 Object [] 的实例中返回。

它返回Object[]的列表,其中每个Object[]代表一行,当您尝试将此Object[]转换为Session时,您会收到错误,< / p>

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to Session

答案 2 :(得分:0)

您的查询不会返回List<Session>,而是List<Object[]>,因为它会查询两个属性(IDNAME)。

您不应该使用SQL,而是使用HQL。你的查询应该是

select s from Session s where s.deleted = false

(假设您的实体具有类型为boolean的deleted字段。)

您还应该将实体重命名为Session以外的其他内容,因为它与Hibernate会话类型冲突。