2012-07-16 132 views
2

我需要通過在Hibernate中執行本機查詢來獲得結果集。雖然我使用的是EntityManager,但查詢和結果集可能不是實體。Hibernate JPA本機查詢結果集

需要獲取List的ResultSet。由於選擇輸出可能會有所不同(動態讀取),我不能使用SqlResultSetMapping。

當我試着下面的代碼,我得到了一個結果。因爲我要求的是單一的價值結果。 (休眠JPA)

Query query = manager.createNativeQuery("select name from fresher_test where id=1"); 
List<Object> amount = query.getResultList(); 

if(amount == null) 
{ 
    System.out.println("Hey its a null"); 
    return; 
} 
for(Object e : arr) 
{ 
    System.out.println(e.toString()); 
} 

輸出爲:艾麗絲

當我試圖得到一個以上的從與查詢相同的代碼選擇名稱選擇的,指定從fresher_test其中id = 1

輸出結果爲:[Ljava.lang.Object; @ 8b1a4f

一個對象。我如何從這個對象獲取字段?我試圖將對象e(List l =(List)e;)轉換爲List,但是我拋出java.lang.ClassCastException:java.lang.String不能轉換爲java.util.List。

這有一種方法,我可以得到一個列表或數組中的值?

注意:由於結果可能是動態的,因此無法使用結果類/實體。

+0

列表量= NULL; \t \t \t amount = query.getResultList(); \t \t \t爲(對象[] E:量) \t \t \t { \t \t \t \t的System.out.println(E [0] + 「」 + E [1]); \t \t \t} – Geez 2012-07-16 10:56:49

回答

13

提取多列時,結果爲List<Object[]>。每個Object[]包含該行的一列。所以在你的情況下,每個Object[]將包含2個元素,第一個是名稱,第二個是名稱。

請注意,getResultList()永遠不會返回null。你不應該檢查。

+0

Thanks Nizet。有效! – Geez 2012-07-16 10:56:29

1

JPA 2.0,如果你想你的結果在自定義的bean:

使具有特定構造一個bean

package my.package; 
public class MyBean{ 
... 
    public MyBean(Long id, String desc, Long id2) 
在實體O映射

然後,讓這樣

您的命名查詢
@NamedQuery(name = "myNamedQuery", 
    query = "select new my.package.MyBean(e.idSomething, e.description, e.secondId) 
      from DBEntity e") 
0

我面臨同樣的問題,在這裏如何解決它:http://mariemjabloun.blogspot.com/2014/09/jpa-20-native-query-result-mapping-to.html

List<User> records = entityManager.createNamedQuery("latestStatusByUser").getResultList(); 
List<User> userRecords = new ArrayList<User>(); 
Iterator it = records.iterator(); 

while (it.hasNext()) { 
    Object[] result = (Object[])it.next(); // Iterating through array object 

    userRecords.add(new User(result[0], result[1], result[2], result[3], result[4], result[5], result[6], result[7])); 

    } 
1

您可以使用以下

NativeQueryImpl nativeQuery = (NativeQueryImpl) query; 

nativeQuery.setResultTransformer(AliasToEntityMapResultTransformer.INSTANCE); 
    List<Map<String,Object>> result = nativeQuery.getResultList();