【发布时间】:2013-12-02 05:30:27
【问题描述】:
假设我有一个实体:
@Entity
public class Person {
@Id
@GeneratedValue
private Long id;
@ManyToMany(fetch = FetchType.LAZY)
private List<Role> roles;
@ManyToMany(fetch = FetchType.LAZY)
private List<Permission> permissions;
// etc
// other fields here
}
我希望使用 Criteria API 构建一个查询,该 API 过滤这些用户并显示人员列表以及来自实体的其他信息 - 一个人有多少角色。
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<Person> query = builder.createQuery(Person.class);
Root<Person> personRoot = query.from(Person.class);
// predicates here
但是,这限制了我只返回Person 实体的列表。我总是可以在实体中添加一个@Transient 字段,但这看起来很难看,因为我可能有很多不同的查询,并且最终可能会有很多这样的字段。
另一方面 - 我不能使用 HQL 并编写查询,因为我需要复杂的过滤,而且我必须处理从 HQL 查询中添加和删除内容。
我的问题,除了这篇文章的标题是这样的:我如何使用 Criteria API 查询数据库并返回一个非实体(如果我想过滤 Person 表但只返回数量角色、权限等)以及如何为非常接近实际实体的内容执行此操作(例如使用角色计数器而不是角色集合的示例)?
更新
使用 Hibernate 的预测我想出了这个。但还是不知道写TODO。 Projections.count 不起作用,因为它需要某种分组,而且我似乎无法在 Hibernate 文档中找到任何示例。
Criteria cr = session.createCriteria(Person.class);
if (id != null) {
cr.add(Restrictions.eq("id", id));
}
ProjectionList projectionList = Projections.projectionList();
projectionList.add(Projections.property("id"), "id");
projectionList.add(TODO, "rolesCount");
【问题讨论】:
-
你在寻找类似this answer的东西吗?
-
这两个答案返回一个计数/总和,这只是我需要的一部分。我总是可以有多个查询 - 例如一个过滤实体和一个计算角色然后映射 rwo 结果,但我正在寻找一种实用的方法来在一个 Criteria 查询中执行这些操作。
-
这个答案与我更新的问题无关。
标签: java hibernate jpa hql criteria