2011-12-26 109 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);