不能转换迭代器对象
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<Session>
,而是返回List<Object[]>
,因为它查询两个属性(ID
和NAME
)。
您不应该使用 SQL,而应该使用 HQL。你的查询应该是
select s from Session s where s.deleted = false
(假设您的实体有一个布尔类型的 deleted
字段)。
您还应该将实体重命名为 Session 以外的名称,因为它与 Hibernate Session 类型冲突。
【讨论】:
以上是关于不能转换迭代器对象的主要内容,如果未能解决你的问题,请参考以下文章