我编写了这段代码来将迭代器对象强制转换为预定义的对象,但它失败并引发了类强制转换异常:
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>
这里有什么问题?
答案 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[]>
,因为它会查询两个属性(ID
和NAME
)。
您不应该使用SQL,而是使用HQL。你的查询应该是
select s from Session s where s.deleted = false
(假设您的实体具有类型为boolean的deleted
字段。)
您还应该将实体重命名为Session以外的其他内容,因为它与Hibernate会话类型冲突。