我需要通过在 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。
有一种方法可以获取列表或数组中的值??
注意:我无法使用结果类/实体,因为结果可能是动态的。
获取多列时,结果是
List<Object[]>
。每个 Object[]
包含该行的一列。因此,在您的情况下,每个 Object[]
将包含 2 个元素,第一个是名称,第二个是名称。
请注意,
getResultList()
永远不会返回null。你不应该检查这个。
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")
您可以使用以下
NativeQueryImpl nativeQuery = (NativeQueryImpl) query;
nativeQuery.setResultTransformer(AliasToEntityMapResultTransformer.INSTANCE);
List<Map<String,Object>> result = nativeQuery.getResultList();
在休眠 6 中:
NativeQuery<Map<String, Object>> nativeQuery = (NativeQueryImpl<Map<String, Object>>) entityManager.createNativeQuery(query);
nativeQuery.setTupleTransformer(NativeQueryMapTransformer.INSTANCE);
List<Map<String,Object>> result = nativeQuery.getResultList();
我遇到了同样的问题,这里是如何解决的:
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]));
}