Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在hibernate中获取所有子实体的特定属性作为列表?_Java_Hibernate - Fatal编程技术网

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