在我的Spring MVC项目中我使用Hibernate,通过使用Criteria API,我正在应用Group BY和Order BY子句。查询在DB上成功执行,它也带来了结果,但它是一个Object -
数组以下是Criteria 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 :(得分:0)
您有两种选择。当你使用投影时,Hibernate不知道如何尊重每个字段,因为它使用每个字段的名称来构建对象,而他还不知道这些名称。
因此,您的第一个选项是将分组的字段命名为与对象属性的名称匹配。即使您在投影中使用的字符串已经是对象字段的名称,这也是必需的。类似的东西:
.add(Projections.groupProperty("fkAccademicYearId"), "fkAccademicYearId") // same value
.add(Projections.groupProperty("fkAssessmentPlanID"), "other") // other value
第二个选项是按照自己的建议做,创建自己的ResultTransformer实现。如果您想要提取此查询的其他对象,我会认为这是一个有趣的选项,就像您进行报告一样。