我正在使用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)
可能是什么问题?
答案 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的文档并了解它返回的内容。