Java 如何在hibernate中获取所有子实体的特定属性作为列表?
我有一个父类:Java 如何在hibernate中获取所有子实体的特定属性作为列表?,java,hibernate,Java,Hibernate,我有一个父类: public class User { Long id; String name; @OneToMany(...) List<Role> roles ... } 我是否可以使用Hibernate查询语言查询user表以获得如下响应: public class ResponseModel { Long userId; Long userName; List<String> roleNames
public class User {
Long id;
String name;
@OneToMany(...)
List<Role> roles
...
}
我是否可以使用Hibernate查询语言
查询user
表以获得如下响应:
public class ResponseModel {
Long userId;
Long userName;
List<String> roleNames;
}
公共类响应模型{
长用户标识;
长用户名;
罗莱南名单;
}
基本上,我想要的是user
的一些属性,只想要user的roleNames
,而不是Role
的整个富对象,您可以使用join hql和
已更新
下面的示例返回一个响应模型列表,但并不完全是您需要的
这只是了解如何只获取必填字段的起点
List<ResponseModel> responseModel = session
.createQuery(
"select u.userId, r.roleId, r.roleName from User u join Role r ")
.setResultTransformer(
new ResultTransformer() {
@Override
public Object transformTuple(
Object[] tuple,
String[] aliases) {
return new ResponseModel(
(Long) tuple[0],
(Long) tuple[1]
(String) tuple[2]
);
}
@Override
public List transformList(List collection) {
return collection;
}
}
)
.getResultList();
List responseModel=会话
.createQuery(
“从用户u加入角色r中选择u.userId、r.roleId、r.roleName”)
.SETRESULT变压器(
新结果变压器(){
@凌驾
公共对象转换元组(
对象[]元组,
字符串[]别名){
返回新的ResponseModel(
(长)元组[0],
(长)元组[1]
(字符串)元组[2]
);
}
@凌驾
公共列表列表(列表集合){
回收;
}
}
)
.getResultList();
您可以使用标准来获取作为用户对象的值,而不是使用HQL
Criteria criteria = session.createCriteria(User.class);
criteria.setFetchMode("roles", FetchMode.SELECT);
从标准列表中,您可以获得所需角色的名称
User user = (User)criteria.list().get(0);
List<Role> roleList = user.getRoles();
List<String> roleNames = new ArrayList();
for(Role role : roleList)
{
roleNames.add(role.getRoleName());
}
ResponseModel responseModel = new ResponseModel();
responseModel.setUserID(user.getID());
responseModel.setUserName(user.getName());
responseModel.setRoleName(roleNames);
User=(用户)条件.list().get(0);
List roleList=user.getRoles();
List roleNames=new ArrayList();
for(角色:roleList)
{
添加(role.getRoleName());
}
ResponseModel ResponseModel=新的ResponseModel();
setUserID(user.getID());
setUserName(user.getName());
responseModel.setRoleName(roleNames);
这将读取整个对象,因此从性能角度来看,它并不比具有fetch子句的类似HQL好。这不起作用,因为它不会将角色名称聚合到集合中。可能用作起点。@user261203是的,您是对的。要获取角色列表,他应该使用另一个查询或转换返回的列表。更新了答案。
User user = (User)criteria.list().get(0);
List<Role> roleList = user.getRoles();
List<String> roleNames = new ArrayList();
for(Role role : roleList)
{
roleNames.add(role.getRoleName());
}
ResponseModel responseModel = new ResponseModel();
responseModel.setUserID(user.getID());
responseModel.setUserName(user.getName());
responseModel.setRoleName(roleNames);