2011-12-26 123 views
0

我正在使用struts,hibernate和jsp开发我的网站。我曾打电话的函数,而在我的DAO页从我的操作页面这样的:java class cast异常错误

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

和吾道功能我写了这样的代码

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) 

可能是什么问题?

回答

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

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

在上面的语句salesDetails必须接受元素这是“订单”类型。

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是类型“对象”和你正在返回salesDetails相同的东西。

所以按你的说法

salesDetails预计将持有令持有的对象。

因此,它的抛出ClassCastException。

+0

你是对的Hibernate SQLQUery函数返回不同格式的数据,即使我从订单表中检索数据。我想我需要改变查询。不管怎样,谢谢。 – anoop 2011-12-26 14:57:56

+0

欢迎来到Anoop .. – Sabya 2011-12-26 16:34:47

0

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

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

应该是ArrayList<Order>

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

1

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

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

您在使用Hibernate通过调用list()返回对象数组列表的native SQL scalar queries,其值可以再映射到自己的类型。

如果你想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);