1

在过去的 4 小时里,我一直在寻找并尝试在谷歌上搜索的用于转换命名查询结果的教程,但没有找到可行的解决方案。当我运行下面的代码片段时,我收到一个java.lang.ClassCastException错误(见下文)。

我从使用sessionCriteria(有效)获取整个记录结果切换到使用getNamedQuery.


原始代码块

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);
}
4

2 回答 2

3

SELECT 子句查询多个列或实体,结果聚合在 getResultList( ) 返回的 java.util.List 中的对象数组 (Object[]) 中。

在这里,您将其投射到RunContainer会导致问题的位置。遍历列表并从数组中获取单个字段。

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);

您可以参考这里了解更多详情。

于 2013-03-01T05:45:02.987 回答
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)

于 2013-03-01T05:32:37.950 回答