不能转换迭代器对象

Posted

技术标签:

【中文标题】不能转换迭代器对象【英文标题】:Can not cast iterator object 【发布时间】:2013-11-19 11:09:08 【问题描述】:

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

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>

这里有什么问题?

【问题讨论】:

显示您的命名查询 你注释你的Session实体类了吗?使用SqlResultSetMapping? 【参考方案1】:

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

return sessionsQuery.list();

在上述问题中,您正在使用迭代器迭代列表并再次存储到 ArrayList 中,而无需创建对象

而是返回您从上述代码中获得的列表。

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

   List<Object[]> 

因为您已经通过了 select 运算符的预测

相反,您可以将查询设为

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

【讨论】:

【参考方案2】:

如果您查看 Query#list() 的文档(强调我的)

以列表形式返回查询结果。如果查询前行包含多个结果,则结果将在 Object[] 的实例中返回。

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

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

【讨论】:

【参考方案3】:

您的查询不返回List&lt;Session&gt;,而是返回List&lt;Object[]&gt;,因为它查询两个属性(IDNAME)。

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

select s from Session s where s.deleted = false

(假设您的实体有一个布尔类型的 deleted 字段)。

您还应该将实体重命名为 Session 以外的名称,因为它与 Hibernate Session 类型冲突。

【讨论】:

以上是关于不能转换迭代器对象的主要内容,如果未能解决你的问题,请参考以下文章

迭代器生成器

迭代器

迭代器

python迭代器

迭代器

可迭代对象和迭代器的区别