我试图连接3个表,以获得所需的信息使用entityManager.createQuery
。
代码较少,如下所示:
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。
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获取/转换返回的对象?
发布于 2017-05-28 14:53:28
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。
List<Object[]> retrievedObjects = //yourCode.
for (Object[] objs : retrievedObjects) {
//write convert method which populates **UserDetails** fields from the objects.
UserDetails ud = convert(objs);
}
发布于 2017-05-28 21:43:26
您可以使用结果转换器。结果转换器是Hibernate特性(而不是JPA)。因此,您需要使用Hibernate中的Session
或Query
。
就像这样:
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
中有相应的属性。
class UserDetails
{
private String loginId;
public String getLoginId() {
return loginId;
}
public void setLoginId(String loginId) {
this.loginId = loginId;
}
}
https://stackoverflow.com/questions/44228580
复制相似问题