【问题标题】:Hibernate JPA Native Query ResultSetHibernate JPA 原生查询结果集
【发布时间】:2012-07-15 04:51:42
【问题描述】:

我需要通过在 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 作为 select name,designation from 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。

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

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

【问题讨论】:

  • 列表 数量 = null;数量= query.getResultList(); for(Object[] e : amount) { System.out.println(e[0] +""+ e[1]); }

标签: hibernate jpa


【解决方案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]));

    }

【讨论】:

    【解决方案2】:

    你可以使用下面的

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

    【讨论】:

    • 谢谢哥们,你拯救了我的一天。这个解决方案就像 Wonder。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2021-02-13
        • 2017-12-13
        • 2018-03-17
        • 1970-01-01
        • 2012-10-12
        • 2011-08-31
        • 2021-10-12
        • 2010-11-03
        相关资源
        最近更新 更多