将Object转换为Class对象

时间:2013-03-21 08:47:40

标签: spring spring-mvc hibernate-criteria

在我的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()会帮助我吗?

1 个答案:

答案 0 :(得分:0)

您有两种选择。当你使用投影时,Hibernate不知道如何尊重每个字段,因为它使用每个字段的名称来构建对象,而他还不知道这些名称。

因此,您的第一个选项是将分组的字段命名为与对象属性的名称匹配。即使您在投影中使用的字符串已经是对象字段的名称,这也是必需的。类似的东西:

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

第二个选项是按照自己的建议做,创建自己的ResultTransformer实现。如果您想要提取此查询的其他对象,我会认为这是一个有趣的选项,就像您进行报告一样。