[Ljava.lang.Object;无法转换为com.gates.cloud.model.something

时间:2016-08-09 02:29:26

标签: java hibernate

我想从数据库中获取值,在我的情况下,我使用List从数据库中获取值,但是我收到了这个错误

ex = (java.lang.ClassCastException) java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.gates.cloud.model.StaffAttendanceTemp

这是我的清单:

List<StaffAttendanceTemp> attendanceTempList = ds.doQuery("SELECT distinct a.staf.stafPK.kod, a.attendancedate FROM StaffAttendanceTemp a"
    + " WHERE a.staf.stafPK.companyid = :companyid")
        .setParameter("companyid", this.getSession().getCompanyid()).getResultList();

System.out.println(attendanceTempList.getClass().getSimpleName());

List<StaffAttendanceTemp> attendanceTempList2 = ds.doQuery("SELECT a FROM StaffAttendanceTemp a"
    + " WHERE a.staf.stafPK.companyid = :companyid")
        .setParameter("companyid", this.getSession().getCompanyid()).getResultList();

System.out.println(attendanceTempList2.getClass().getSimpleName());

这是我的循环

for (StaffAttendanceTemp attendanceTemprecursive : attendanceTempList) {
    Date timePunchin = null;
    Date timeBreakout = null;
    Date timeBreakin = null;
    Date timePunchout = null;
    Date tarikhPunch = null;

    for (StaffAttendanceTemp attendanceTemp2recursive : attendanceTempList2) {
    }
}

如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

问题来自:

List<StaffAttendanceTemp> attendanceTempList = ds.doQuery("SELECT distinct a.staf.stafPK.kod, a.attendancedate FROM StaffAttendanceTemp a"
    + " WHERE a.staf.stafPK.companyid = :companyid")
        .setParameter("companyid", this.getSession().getCompanyid()).getResultList();

如您所见,ds.doQuery()返回一个对象,在这种情况下返回List<Object>而不是List<StaffAttendanceTemp>类。因此发生错误是因为没有适当的步骤,无法将Object类强制转换为自定义类。

  

一般规则如下:

     

如果select包含单个表达式并且它是一个实体,那么结果   是那个实体

     

如果select包含单个表达式,则它是a   原始的,然后结果是原始的

     

如果select包含多个   表达式,然后结果是包含相应的Object []   原语/实体因此,在您的情况下,列表是一个列表。

您可以参考:

JPA Entity 1

JPA query result

您可以尝试的解决方案之一是将查询更改为:

List<StaffAttendanceTemp> attendanceTempList = ds.doQuery("SELECT distinct a FROM StaffAttendanceTemp a"
    + " WHERE a.staf.stafPK.companyid = :companyid")
        .setParameter("companyid", this.getSession().getCompanyid()).getResultList();

或者如果你真的只想要一个特定的参数,你需要处理这样的对象:

List<Object[]> attendanceTempList = ds.doQuery("SELECT distinct a.staf.stafPK.kod, a.attendancedate FROM StaffAttendanceTemp a"
    + " WHERE a.staf.stafPK.companyid = :companyid")
        .setParameter("companyid", this.getSession().getCompanyid()).getResultList();

for (Object[] listContent : attendanceTempList) {
//deal with Object[] here
}