2013-09-27 116 views
4

我是新來的所有這個Hibernate/JPA的東西,所以我會盡量做到儘可能清晰。休眠 - createNativeQuery與「非實體類」結果

Hibernate中有沒有什麼方法可以使用createNativeQuery在查詢中選擇一個或多個字段,而無需使用實體類作爲返回對象?

我試圖做到這一點,而不使用任何XML相關的東西。

Query query = getEntityManager().createNativeQuery("select name from contact where id_contact = :idContact", String.class); 
query.setParameter("idContact", 9293L); 
Object string = query.getSingleResult(); 
System.out.println(string); 

使用這個我有例外:Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.MappingException: Unknown entity: java.lang.String

感謝

編輯:

我也試過:

Query query = getEntityManager().createNativeQuery("select name from contact where id_contact = :idContact"); 
query.setParameter("idContact", 9293L); 
List list = query.getResultList(); 
if (!list.isEmpty()){ 
    Object string = list.get(0); 
    System.out.println(string); 
} 

以同樣的異常:Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to [Ljava.lang.Object;

編輯(2): 我開始認爲這是無論是在休眠錯誤或這是不可能做這樣的事情......

回答

1

只是嘗試調用createNativeQuery()沒有通過String.class。如果name列在數據庫query.getSingleResult()中是字符串類型,實際上將返回String

8

問題是您正在將String.class作爲第二個參數傳遞給createNativeQuery。這將使休眠嘗試使用String.class爲結果集創建映射。它只能從實體類創建映射,而String不是實體類,因爲它沒有映射到表。

幸運的是,解決方案是簡單地使用不需要第二個參數的重載版本createNativeQuery

String SQL = ".."; //same SQL as you had before 
Query query = getEntityManager().createNativeQuery(SQL); //no entity mapping 
query.setParameter("idContact", 9293L); 
Object string = query.getSingleResult(); 
System.out.println(string); 
0

嘗試

Query query = getEntityManager().createNativeQuery("select name from contact where id_contact = :idContact", String.class); 
query.setParameter("idContact", 9293L); 
List list = query.getResultList(); 
if (!list.isEmpty()){ 
    Object string = list.get(0); 
    System.out.println(string); 
} 

在查找這裏

http://sysout.be/2011/03/09/why-you-should-never-use-getsingleresult-in-jpa

+0

相同拋出異常:異常在線程 「主要」 java.lang.ClassCastException:java.lang中。字符串不能轉換爲[Ljava.lang.Object; – Joshua

5

在本地查詢或與JPQL列名的EntityManager的情況下返回對象的數組列表。

所以得到結果列表。

收到的

List<Object[]> listResults = query.getResultList(); 

然後迭代它: -

for (Object[] record : listResults) { 

      //Iterate Logic will come here 

        } 
+0

同樣的例外:線程「main」中的異常java.lang.ClassCastException:java.lang.String不能轉換爲[Ljava.lang.Object; – Joshua

+0

我已經更新了我的回覆,請現在檢查。 – AjGupta

+0

listResults是Object []的列表,因此您需要迭代Object []以獲取數據 – Bob

0
String SQL = ".."; //same SQL as you had before 
Query query = getEntityManager().createNativeQuery(SQL); //no entity mapping 
query.setParameter("idContact", 9293L); 
String string = (String)query.getSingleResult(); 
System.out.println(string); 
+1

雖然此代碼可能回答此問題,但提供有關如何解決問題和/或解決問題原因的其他上下文會改善答案的長期價值。 – wasthishelpful