Hibernate JPA Native Query ResultSet

时间:2012-07-16 10:40:47

标签: hibernate jpa

我需要通过在Hibernate中执行本机查询来获取结果集。虽然我使用的是EntityManager,但查询和resultSet可能不是实体。

需要获取List的ResultSet。由于选择输出可能会有所不同(读取动态),因此无法使用SqlResultSetMapping。

当我尝试以下代码时,我得到了一个结果。因为我要求的是单一价值的结果。 (Hibernate 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());
 }

输出是:Alice

当我尝试从同一代码中选择多个选项时,使用查询选择名称,从fresher_test指定id = 1

输出为:[Ljava.lang.Object; @ 8b1a4f

一个对象。如何从此对象获取字段?我试图将对象e(List l =(List)e;)强制转换为List但我抛出了java.lang.ClassCastException:java.lang.String无法强制转换为java.util.List。

有一种方法可以获取List或Array中的值吗?

注意:我不能使用结果类/实体,因为结果可能是动态的。

4 个答案:

答案 0 :(得分:14)

获取多个列时,结果为List<Object[]>。每个Object[]包含该行的一列。因此,在您的情况下,每个Object[]将包含2个元素,第一个是名称,第二个是名称。

请注意,getResultList()永远不会返回null。你不应该检查它。

答案 1 :(得分:2)

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")

答案 2 :(得分:1)

您可以使用以下

NativeQueryImpl nativeQuery = (NativeQueryImpl) query; 

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

答案 3 :(得分: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]));

    }