2013-03-21 51 views
1

我正在應用Group BY和Order BY子句。查詢中獲取成功的DB執行,它帶來的結果也不過它Object--在我的Spring MVC項目中使用Hibernate使用Criteria API將對象轉換爲類對象

這裏的數組是標準API

Criteria criteria = session.createCriteria(DashboardSubindicatorSubmission.class, "DashboardSubindicatorSubmission") 
       .setProjection(Projections.projectionList() 
         .add(Projections.sum("InputValue").as("InputValue")) 
         .add(Projections.groupProperty("fkAccademicYearId")) 
         .add(Projections.groupProperty("fkAssessmentPlanID")) 
         .add(Projections.groupProperty("fkSubindicatorID")) 
         .add(Projections.groupProperty("InputTitle"))) 
       .addOrder(Order.asc("fkAccademicYearId")) 
       .addOrder(Order.asc("fkAssessmentPlanID")) 
       .addOrder(Order.asc("InputTitle")); 
     List<DashboardSubindicatorSubmission> dashboardSubindicatorSubmissionList = (List<DashboardSubindicatorSubmission>)criteria.list(); 
     session.flush(); 
     transaction.commit(); 
     return dashboardSubindicatorSubmissionList; 

我鑄造criteria.list()List<DashboardSubindicatorSubmission>但代碼時,我嘗試做dashboardSubindicatorSubmissionList.get(i)上控制器它給了我例外java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to mkcl.accreditation.model.DashboardSubindicatorSubmission

我才知道,雖然我爲它鑄造於List<DashboardSubindicatorSubmission>還是其object[]這就是一個列表,爲什麼我不能做dashboardSubindicatorSubmissionList.get(i),因爲它返回我的DashboardSubindicatorSubmission對象。 (糾正我,如果我錯了)

那麼我怎麼能將我的結果轉換成DashboardSubindicatorSubmission類的列表? 在這種情況下,setResultTransformer()能幫助我嗎?

回答

0

你有兩種選擇。在使用投影時,Hibernate不知道如何尊重每個字段,因爲它使用每個字段的名稱來構建對象,而且他還不知道名稱。

因此,您的第一個選擇是命名分組的字段,以便它們與對象屬性的名稱相匹配。即使您在投影中使用的字符串已經是對象字段的名稱,這也是必需的。喜歡的東西:

.add(Projections.groupProperty("fkAccademicYearId"), "fkAccademicYearId") // same value 
.add(Projections.groupProperty("fkAssessmentPlanID"), "other") // other value 

第二個選擇是做你自己的建議,創建自己的實現使用ResultTransformer的。我認爲這是一個有趣的選項,如果你想提取這個查詢的其他對象,就像你做報告一樣。

相關問題