2014-01-28 26 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