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