JPA 2.0 本机查询结果映射到 Bean

Posted

技术标签:

【中文标题】JPA 2.0 本机查询结果映射到 Bean【英文标题】:JPA 2.0 Native Query Result Mapping to a Bean 【发布时间】:2014-06-25 08:03:27 【问题描述】:

我有一个复杂的本地查询。所以使用 JPA 2.0(带有 Hibernate 实现),我声明了一个 NamedNativeQuery

@NamedNativeQuery(name="latestStatusByUser",
            query=" with latest_behav_status as "
                    + " (select .......),"
                    + " latest_behav_avail as ("
                    + " .......) "
                    + " select ........"                        
                    + " from user "
                    + " left outer join latest_behav_status lbs .... "
                    + " left outer join...."

所以在我的代码中我调用:

List<UserBehavior> rec = entityManager.createNamedQuery("latestStatusByUser").getResultList();

但是,结果,我得到了一个对象列表而不是用户行为列表。即使我指定了结果类,我也会收到错误,因为 UserBehavior 是 POJO 而不是实体。

使用命名查询,我可以使用新的:

 select new org.project.UserBehavior(user_i...) from

但是如何使用 NativeQuery 和 JPA2.0(JPA2.1 自带解决方案,使用 @ConstructorResult):

http://mariemjabloun.blogspot.com/2014/05/jpa-mapping-native-query-to-bean-pojo.html

所以问题是如何使用 JPA 2.0 将结果集映射到 Bean 中??

【问题讨论】:

在 *** 上查看此答案:***.com/questions/13012584/… 使用 JPA 2.0 似乎无法实现您想要实现的目标。使 UserBehavior 成为 @Entity 对您没有解决方案吗?从数据库检索结果后,您仍然可以将其数据复制到 DTO 或 POJO 中。也许我们需要更多关于您的上下文的信息。 【参考方案1】:

不可能使 POJO(用户)成为实体。所以为了解决这个问题,我手动映射了我返回的对象数组列表。

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

        

【讨论】:

以上是关于JPA 2.0 本机查询结果映射到 Bean的主要内容,如果未能解决你的问题,请参考以下文章

使用 JPA 2.1,我如何将本机查询结果映射到 @Transient 字段(taht is a Set)?

映射异常:在 JPA 2.0 中外部化命名本机查询时无法读取 XML

Spring Data JPA 将原生查询结果映射到非实体 POJO

EclipseLink 拒绝将 PostgreSQL 上的本机查询映射到实体

Doctrine 2.0 结果集映射使用不正确?

jpa 2.1中的@ConstructorResult映射