Hibernate JPA 原生查询结果集

问题描述 投票:0回答:5

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

需要获取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());
 }

输出是:爱丽丝

当我尝试从同一代码中使用 Query as select name,designation from fresher_test where id=1 获取多个选择时

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

一个物体。如何从该对象获取字段?我尝试将对象 e (List l = (List) e;) 类型转换为列表,但我抛出 java.lang.ClassCastException: java.lang.String 无法转换为 java.util.List。

有一种方法可以获取列表或数组中的值??

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

hibernate jpa
5个回答
16
投票

获取多列时,结果是

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

请注意,

getResultList()
永远不会返回null。你不应该检查这个。


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
投票

您可以使用以下

NativeQueryImpl nativeQuery = (NativeQueryImpl) query; 

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

0
投票

在休眠 6 中:

NativeQuery<Map<String, Object>> nativeQuery = (NativeQueryImpl<Map<String, Object>>) entityManager.createNativeQuery(query);
nativeQuery.setTupleTransformer(NativeQueryMapTransformer.INSTANCE);
List<Map<String,Object>> result = nativeQuery.getResultList();

-1
投票

我遇到了同样的问题,这里是如何解决的:

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]));

    }
© www.soinside.com 2019 - 2024. All rights reserved.