3

我需要通过在 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 作为选择名称从同一个代码中获取多个选择时,指定来自fresher_test where id=1

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

一个东西。如何从该对象中获取字段?我试图将对象 e (List l = (List) e;) 类型转换为 List,但我抛出 java.lang.ClassCastException: java.lang.String cannot be cast to java.util.List。

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

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

4

4 回答 4

16

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

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

于 2012-07-16T10:49:48.137 回答
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")
于 2014-01-30T22:38:05.383 回答
2

你可以使用以下

NativeQueryImpl nativeQuery = (NativeQueryImpl) query; 

nativeQuery.setResultTransformer(AliasToEntityMapResultTransformer.INSTANCE); 
    List<Map<String,Object>> result = nativeQuery.getResultList();
于 2017-06-26T15:44:03.620 回答
-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]));

    }
于 2014-09-24T06:42:34.513 回答