java - 无法将 getNamedQuery 结果转换为表类

标签 java hibernate classcastexception

过去 4 小时我一直在寻找并尝试在 google 上搜索的用于转换命名查询结果的教程,但尚未找到可行的解决方案。当我运行下面的代码片段时,我收到一个 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);
}

最佳答案

The SELECT clause queries more than one column or entity, the results are aggregated in an object array (Object[]) in the java.util.List returned by getResultList( ).

在这里,您将其转换为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("从 RunContainer 中选择 id、日期、注释").addEntity(RunContainer.class);

您可以引用here更多细节。

关于java - 无法将 getNamedQuery 结果转换为表类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15150776/

相关文章:

java - 我应该为 List< 类型的参数设置什么值?扩展 Map<String, ?>>?

java - Tomcat,引用静态变量帮助生成wsdl

scala - 如何避免在 Scala 中使用 asInstanceOf

java - Hibernate Weblogic 10.3.4 java.lang.NoSuchMethodError : javax/persistence/spi/PersistenceUnitInfo. getValidationMode()Ljavax/persistence/ValidationMode;

java - 奇怪的 classCastException hibernate 3.5 glassfish

spring-mvc - Spring MVC——java.lang.ClassCastException

java - 通过正则表达式提取以#开头的单词(多个空格)

java - 如何使用 MockMVC 传递 Controller 的 @RequestBody 参数

java - 如何使用 Hibernate 调用 PostgreSQL 存储过程

hibernate - 如何应对 'org.postgresql.util.PSQLException: No value specified for parameter 1' ?