2011-08-10 58 views
1

使用JPQL查詢數據庫,但無法使用List檢索「Report」表的行。這是我的代碼段:Java:使用列表從持久性查詢語言中檢索結果

... 
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hibernate"); 
EntityManager em = emf.createEntityManager(); 
EntityTransaction tx = em.getTransaction(); 
tx.begin(); 
Query query = em.createQuery("SELECT r.title, r.company FROM Report as r"); 
    List<Report> itemList = query.getResultList(); 
    for (Report item : itemList) 
    { 
     System.out.println("Item: " + item.getCompany()); 
    } 

輸出是:

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to maps.Report at hello.Test.main(Unknown Source) 

Java結果:1

我在做什麼錯?爲什麼我不被允許進行演員?

回答

2

您的查詢不會選擇Report的實例。它選擇兩個字段:r.titler.company。在這種情況下,JPA返回一個列表Object[]。列表中的每個Object[]包含兩個元素:標題和公司。

使用select r from Report r來選擇Report實例。

+0

是的,非常感謝!我還在hibernate-entity manager文檔中找到了關於標量結果的[link](http://docs.jboss.org/hibernate/entitymanager/3.6/reference/en/html/objectstate.html#d0e1152),以及如何處理它們。再次感謝 – giorgioca

0

您需要創建一個TypedQuery。

String sql = "select r from Report r"; 
TypedQuery<Report> query = em.createQuery(sql, Report.class); 
List<Report> reports = query.getResultList(); 
+0

這不會讓Hibernate奇蹟般地將它所選擇的元組更改爲Report實例。 –

+0

從OP的「createQuery」語句後面的代碼*可以清楚地看到OP不**需要元組。 – Jeremy

+0

我的觀點是,重要的是要更改HQL(不是SQL,BTW),而不是創建TypedQuery。即使使用無類型的查詢,他的代碼也可以(他只是有一個編譯器警告)。並且,考慮到他的HQL查詢,我猜測OP希望選擇僅填充了標題和公司字段的Report實例,這是不可能的。 –