2012-07-16 59 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();