java类转换异常错误

时间:2011-12-26 13:01:39

标签: java

我正在使用struts,hibernate和jsp开发我的网站。我从我的操作页面调用了一个函数,它位于我的DAO页面中,如下所示:

private List<Order> salesDetails = new ArrayList();
salesDetails = doctorDao.getInstance().getDoctorSalesDetails(SessionObj.getId(),activityGraph);

在我的dao函数中,我编写了像这样的代码

public List getDoctorSalesDetails(int id,int activityGraph){
    List<Order> doctorSalesDetails=new ArrayList();        
    try{
       SessionFactory sessionFactory =
                (SessionFactory) ServletActionContext.getServletContext().getAttribute(HibernateListener.KEY_NAME);
        Session Hibernatesession = sessionFactory.openSession();
        Hibernatesession.beginTransaction();
        doctorSalesDetails =    Hibernatesession.createSQLQuery("SELECT total_amount,created_at FROM `order` WHERE created_at > DATE_SUB(curdate(),INTERVAL "+activityGraph+" DAY) AND doctor_id = "+id+" GROUP BY created_at").list();
        Hibernatesession.getTransaction().commit();
    }catch(Exception e){
        e.printStackTrace();
    }
    return doctorSalesDetails;
}

查询结果在此处成功运行。问题是当我从我的操作页面访问返回变量时:

    try{
       for( Order o:  salesDetails) {
           System.out.println("Total amount="+o.getCreatedAt());
       }
    }catch(Exception e){
        e.printStackTrace();
    }

会导致以下错误:

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.myDrDirect.hbmobj.Order
    at com.myDrDirect.doctor.action.DoctorDashBoardActivity.getDashBoardActivityDetails(DoctorDashBoardActivity.java:36)

可能是什么问题?

4 个答案:

答案 0 :(得分:2)

private List<Order> salesDetails = new ArrayList();

salesDetails = doctorDao.getInstance().getDoctorSalesDetails(SessionObj.getId(),activityGraph);

在上面的语句中,salesDetails必须接受“Order”类型的元素。

doctorSalesDetails =    Hibernatesession.createSQLQuery("SELECT total_amount,created_at FROM `order` WHERE created_at > DATE_SUB(curdate(),INTERVAL "+activityGraph+" DAY) AND doctor_id = "+id+" GROUP BY created_at").list();

在上面的行中,doctorSalesDetails的类型为“Object”,与您返回salesDetails的内容相同。

根据你的陈述

预计持有订单的salesDetails持有一个Object。

结果,它抛出了ClassCastException。

答案 1 :(得分:1)

您声明List保持Order的事实只是一个编译时问题。如果传入的列表不包含Order对象(或者Hibernate没有正确返回它们),则可能会遇到此问题。你可能不得不做这样的事情:

for( Object obj:  salesDetails) {
         if(obj instanceof Order){
            Order o = (Order)obj;
           System.out.println("Total amount="+o.getCreatedAt());
         }
}

答案 2 :(得分:1)

您正在使用Hibernate的native SQL scalar queries,通过调用list()返回一个Object数组列表,然后您可以将其值映射到您自己的类型中。

如果您希望Hiberate自动为您映射实体,请尝试entity SQL queries,如此(假设您的实体从提取的列中很好地映射):

doctorSalesDetails = Hibernatesession.createSQLQuery("SELECT total_amount,created_at FROM `order` WHERE created_at > DATE_SUB(curdate(),INTERVAL "+activityGraph+" DAY) AND doctor_id = "+id+" GROUP BY created_at").addEntity(Order.class);

答案 3 :(得分:0)

您正在使用泛型和非泛型的可燃混合物,这种混合物容易出现各种错误。

private List<Order> salesDetails = new ArrayList();

应为ArrayList<Order>

您似乎认为hibernate调用将返回Order对象列表,但它显然返回了更像List<Object[]>的内容。阅读Hibernate API的文档并了解它返回的内容。