2014-01-28 24 views
-1

演员表为什么演员失败?由于我的结果是一个平均值列表。但显然有一些魔法是需要的,因为java认为它是一个对象。演员表从列表<>

当进一步处理这个问题时,似乎q.getResultList()调用会给我一个对我来说很陌生的对象的原始列表,因为它是一个TypedQuery。

TypedQuery<Average> q = em.createQuery("select p.id, p.lastName, p.firstName, c.name, s.serieDate, st.serie_type, st.serie_type_info, count(s.player.id), sum(s.result), avg(s.result) from Serie s, Player p, Club c, SerieType st " + 
     " where p.id = s.player.id" + 
     " and c.id = s.club.id " + 
     " and st.id = s.serieType.id " + 
     " and c.name like '%" + clubName + "%'" + 
     " and st.serie_type like '%" + serieType.getSerie_type() + "%'" + 
     " and st.serie_type_info like '%" + serieType.getSerie_type_info() + "%'" + 
     " and s.serieDate > :startDate" + 
     " and s.serieDate < :endDate" + 
     " group by p.id, p.lastName, p.firstName, c.name, s.serieDate, st.serie_type, st.serie_type_info", Average.class); 
     q.setParameter("startDate", calendarBean.getDate1()); 
     q.setParameter("endDate", calendarBean.getDate2()); 

这里是呼叫

List<Average> resultList = q.getResultList(); 
List<Average> withAverages = CalculateAveragesClub(resultList); 

private List CalculateAveragesClub(List<Average> results) { 
     for (Average average : results) { //error in this cast 
} 

SEVERE: Servlet.service() for servlet [Faces Servlet] in context with path [/BowlingFacelets] threw exception [[Ljava.lang.Object; cannot be cast to com.jk.hcp.Average] with root cause 
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.jk.hcp.Average 
    at com.jk.hcp.ServiceSeries.CalculateAveragesClub(ServiceSeries.java:508) 
+0

首先检查你把里面的方法作为参数,最好是发布更多的代码。 –

+2

你从哪里调用'CalculateAveragesClub',以及该输入参数的类型是什么? – radimpe

+0

抛出的异常究竟在哪里? 尝试设置断点并逐步完成代码。 –

回答

0

随着码和您发布的错误,它看起来像该方法期待一个List<Average>,但在List的元素其实Object[]至少其中之一是)。

下面是Ideone sample重现问题的String类而不是Average

确保在List中有Average个对象。

由于q.getResultList()返回一个原始的List(没有泛型类型),因此在调用该方法的代码上不强制执行类型安全性。

List<Average> resultList = q.getResultList(); 

编辑 按照这种编辑,它看​​起来像List由JPA /休眠Query返回。如果它是沿着SELECT * from average_table行的休眠模式SQLQuery,请确保在SQLQuery上调用addEntity()(以其任何方便的风格),以便它返回Average对象而不是包含查询中所有列的对象数组(或使用HQL /标准如果合适)。

q.addEntity(Average.class); 
List<Average> resultList = q.getResultList(); 

您可能会发现Hibernate参考的Chapter 16 - Native SQL有用的,特别是16.1.2. Entity queries

+0

似乎指的是jboss实体。这是一个Derby数据库,eclipselink用于JPA。 – user2130951

+1

@ user2130951不熟悉'TypedQuery',但似乎JPA不知道如何将选定属性的集合自动转换为“Average”实例。是否有一个使用这些字段的'Average'构造函数?如果是这样的话,你可以试试'SELECT new Average(p.id,...)FROM ...' –

+0

我通过使用复制构造函数解决了它。 – user2130951