我一直在寻找并尝试使用google搜索过去4个小时的命名查询结果的教程,并且没有找到可行的解决方案。当我运行下面代码的snippit时,我收到java.lang.ClassCastException
错误(见下文)。
我从使用sessionCriteria
(有效)获取整个记录结果切换到仅使用getNamedQuery
返回3个表列。
原始代码块
Criteria sessionCriteria = session.createCriteria(RunContainer.class);
@SuppressWarnings ("unchecked")
List<RunContainer> runContainer = sessionCriteria.list();
命名查询代码块
Query query = session.getNamedQuery("RunContainer.GetRunsForCalendar");
List results = query.list();
for(int i = 0; i < results.size(); i++){
RunContainer result = (RunContainer)results.get(i);
System.out.println(result.getNotes());
}
RunContainer表类
@Entity
@Table (name = "container")
@NamedQueries ( {
@NamedQuery (name = "RunContainer.GetRunsForCalendar",
query = "SELECT id, date, notes FROM RunContainer")
})
public class RunContainer {
@Id
@GeneratedValue
@Column (columnDefinition = "INT UNSIGNED")
private Integer id;
private Date date;
@Column(columnDefinition = "TEXT")
private String notes;
...
错误
java.lang.ClassCastException:
[Ljava.lang.Object; cannot be cast to com.scene7.is.qa.jorogumo.tables.RunContainer
任何人都可以帮我调试吗?我是Java的新手,这是我第一个与工作相关的项目。
如果有人遇到这篇文章,下面的代码就是我接受的答案。
Query query = session.getNamedQuery("RunContainer.GetRunsForCalendar");
List<Object> containerResults = query.list();
List<RunContainer> runContainers = new ArrayList<RunContainer>();
for (Object result : containerResults) {
Object[] temp = (Object[]) result;
RunContainer runContainer = new RunContainer();
runContainer.setId((Integer) temp[0]);
runContainer.setDate((Date) temp[1]);
runContainer.setNotes((String) temp[2]);
runContainers.add(runContainer);
}
答案 0 :(得分:2)
SELECT子句查询多个列或实体的结果 聚合在java.util.List中的对象数组(Object [])中 由getResultList()返回。
在这里,您将其投放到RunContainer
,这会导致问题。迭代列表&amp;从数组中获取单个字段。
List containerResults = query.List();
for(Object[] result : containerResults)
{
Integer id = (Integer) result[0];
Date date = (Date) result[1];
String notes = (String) result[2];
}
[注意:提供没有编译的示例代码,相应地进行更改]
修改:或者,如果所选字段与实体中的字段名称相同,则可以尝试
session.createSQLQuery("SELECT id, date, notes FROM RunContainer").addEntity(RunContainer.class);
您可以参考here了解更多详情。
答案 1 :(得分:0)
试试这个:
query.setResultTransformer(Transformers.aliasToBean(RunContainer.class));
请参阅此处的文档:http://docs.jboss.org/hibernate/orm/3.2/api/org/hibernate/Query.html#setResultTransformer(org.hibernate.transform.ResultTransformer)