首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何作为自定义bean从JPA EntityManager获取返回的对象

如何作为自定义bean从JPA EntityManager获取返回的对象
EN

Stack Overflow用户
提问于 2017-05-28 14:49:10
回答 2查看 3.1K关注 0票数 2

我试图连接3个表,以获得所需的信息使用entityManager.createQuery

代码较少,如下所示:

代码语言:javascript
运行
复制
List<Object[]> o=entityManager.createQuery("SELECT u.loginId,ui.emailId,u.userId,ui.firstName,up.password,ui.phoneNunber,u.roleTypeId"  + " From Users as u,UserInfo ui, UserPassword as up where u.userId = up.userId "    + "AND u.userId=ui.userId").getResultList();

我有一个带有上面返回的字段UserDetails的bean。

代码语言:javascript
运行
复制
public class UserDetails
{
    String LoginId;
    String Email;
    String UserId;
    String FirstName;
    String Password;
    String Mobile;
    String RoleTypeId;
    int Status;

getters() & setters()
}

但当我试图使用List of UserDetails而不是List of Object[]时,它说是ClassCastException

如何使用自定义bean获取/转换返回的对象?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-28 14:53:28

代码语言:javascript
运行
复制
 List<UserDetails> o=entityManager.createQuery("SELECT new package.UserDetails( u.loginId,ui.emailId,u.userId,ui.firstName,up.password,ui.phoneNunber,u.roleTypeId)"  + " From Users as u,UserInfo ui, UserPassword as up where u.userId = up.userId "    + "AND u.userId=ui.userId").getResultList();

您需要构造函数的参数与查询中选择的字段的顺序相同,因此UserDetails(loginId、emailId、userId、firstName、password、phoneNunber、roleTypeId)

或者您可以使用您的代码,然后编写一个转换器,该转换器将对象数组转换为UserDetails

代码语言:javascript
运行
复制
 List<Object[]> retrievedObjects = //yourCode.
 for (Object[] objs : retrievedObjects) {
      //write convert method which populates **UserDetails** fields from the objects.
      UserDetails ud = convert(objs);
 }
票数 3
EN

Stack Overflow用户

发布于 2017-05-28 21:43:26

您可以使用结果转换器。结果转换器是Hibernate特性(而不是JPA)。因此,您需要使用Hibernate中的SessionQuery

就像这样:

代码语言:javascript
运行
复制
List<UserDetails> result = entityManager.createQuery(
  "SELECT u.loginId as loginId, ui.emailId as emailId ..."
).unwrap(org.hibernate.query.Query.class)
 .setResultTransformer(new AliasToBeanResultTransformer(UserDetails.class))
 .list();

您需要在HQL:u.loginId as loginId中有别名,在UserDetails中有相应的属性。

代码语言:javascript
运行
复制
class UserDetails
{

  private String loginId;

  public String getLoginId() {
    return loginId;
  }

  public void setLoginId(String loginId) {
    this.loginId = loginId;
  }

}

变压器示例:http://jpwh.org/examples/jpwh2/jpwh-2e-examples-20151103/examples/src/test/java/org/jpwh/test/querying/advanced/TransformResults.java

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44228580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档