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
使用JPA或Hibernate从实体获取一个字段的集合_Hibernate_Jpa 2.0 - Fatal编程技术网

使用JPA或Hibernate从实体获取一个字段的集合

使用JPA或Hibernate从实体获取一个字段的集合,hibernate,jpa-2.0,Hibernate,Jpa 2.0,我目前有一个带有Hibernate映射实体的Spring启动应用程序。其中一个是说一个员工,我想按部门获取所有员工的用户名 类似于SQL: 从departmentId=1且active=true的员工中选择用户名; 员工类别: @实体 公共类Employee extends BaseEntity实现可序列化{ 私有int-id; 私有字符串名称; 私有字符串用户名; 私人大厦; 私有整数部门ID; 私有布尔活动; …关于他们的其他事情。。。 …带注释的getter和setter。。。 } 我

我目前有一个带有Hibernate映射实体的Spring启动应用程序。其中一个是说一个
员工
,我想按部门获取所有员工的用户名

类似于SQL:

从departmentId=1且active=true的员工中选择用户名;
员工类别:

@实体
公共类Employee extends BaseEntity实现可序列化{
私有int-id;
私有字符串名称;
私有字符串用户名;
私人大厦;
私有整数部门ID;
私有布尔活动;
…关于他们的其他事情。。。
…带注释的getter和setter。。。
}
我(相信我)可以通过以下方式让部门的所有员工:

公开列表员工部门(整数部门ID){
Session=getSession();
CriteriaBuilder=session.getCriteriaBuilder();
CriteriaQuery CriteriaQuery=builder.createQuery(Employee.class);
Root=criteriaQuery.from(Employee.class);
criteriaQuery.where(builder.and(
builder.equal(root.get(“部门ID”)、部门ID),
builder.equal(root.get(“活动”),true)))
.orderBy(builder.desc(root.get(“timeCreated”))
。选择(根);
return session.createQuery(criteriaQuery.list();
}
但是,如果我只想要他们的用户名或他们所在的建筑物的
集,那么我不需要填写关于每个员工的其他20多个字段,只需要返回一个字段集

返回会话.createQuery(criteriaQuery).stream()
.map(Comment::getUsername).collect(Collectors.toSet());
然而,这浪费了从DB存储和DB网络到应用程序服务的20多个字段的传输,并且似乎顶部显示的查询是用JPA的对象表示法表示的正确查询。然而,我不知道该写什么;没有一种明显的Hibernate方法可以获得经过过滤的实体集合,因此JPA方法似乎是正确的,但我发现文档并不像我希望的那样容易掌握。我是不是在看这样的东西:

公共设置员工的用户名部门(整数部门ID){
Session=getSession();
CriteriaBuilder=session.getCriteriaBuilder();
CriteriaQuery CriteriaQuery=builder.createQuery(Employee.class);
Root=criteriaQuery.from(Employee.class);
criteriaQuery.where(builder.and(
builder.equal(root.get(“部门ID”)、部门ID),
builder.equal(root.get(“活动”),true)))
.orderBy(builder.desc(root.get(“timeCreated”))
.select(root.select(root.get(“用户名”));
返回新的HashSet(session.createQuery(criteriaQuery.list());
}
这并没有给我正确的类型…
如果我想要一个部门员工建筑位置的独特集合,我需要在那里的某个地方加入
distinct
,但在哪里

你不能创建一个普通的查询,比如
Set usernames=session.createQuery(“从雇员e中选择不同的e.username,其中e.departmentId=:id和e.active=true”).setParameter(“id”,departmentId).getResultList()
@PaulD我的理解是,会话查询字符串会跳转缓存的持久性对象,而根类的CriteriaQuery会在hibernate缓存中包含未刷新的持久性对象,这可能是不对的;这一点我可能是错的,但这就是我试图以这种方式构建它的原因。
Session#createQuery
仍然使用HQL,因此应该使用缓存,只要您启用了它,请参阅@PaulD Thank;我假设你是对的,我将按照你的建议以字符串的形式编写查询。然而,我仍然很好奇如何使用生成器对象表示法来表示等价物。也许这有助于解决这一问题。难道你不能创建一个普通的查询,比如
Set usernames=session.createQuery(“从雇员e中选择不同的e.username,其中e.departmentId=:id和e.active=true”)。setParameter(“id”,departmentId)。getResultList()
@PaulD我的理解是,会话查询字符串跳转缓存的持久性对象进入数据库,而根类的CriteriaQuery将在hibernate缓存中包含未刷新的持久性对象;我可能错了,但这就是为什么我尝试以这种方式构建它。
session\createQuery
仍然使用HQL,因此应该使用缓存,只要您启用了它,请参阅@PaulD谢谢;我假设您是对的,我将按照您的建议以字符串形式编写查询。但是,我仍然很好奇如何使用生成器对象表示法来表示等价物。也许这会有所帮助