Criteria distinct对象结果集
这篇文章是上一篇的续, 主要讲述如何使用Criteria查询distinct后的结果集.
实体:
权限Authority实体与用户User实体是ManyToMany单向关系,所有通过查询Authority可以找到多个User对象, 但我们希望distinct结果集。下面我们通过Criteria 完成这个distinct查询。
输入字符串"readOnly" 作为权限名称模糊查询条件, 匹配的用户
示例代码:
distinct对象结果集的基本思想就是子查询,子查询根据输入条件查询distinct后对象id,外层内存id查询对象。
warning: 外层查询需要指定alias(本例为"user") , 否则会出现throw new MappingException
编后想: 其实有时候我们只需要模型的单独几个属性, 不需要把所有字段都拽出来,这时候可以用投影,但是投影又是基于数组的访问。不知道什么时候hibernate可以把投影查询的字段映射到模型中,没有查询出来的字段为null。这样做列表就会很轻松了:)
结束了, 欢迎讨论指正。转载请保留作者笔名Heipark
这篇文章是上一篇的续, 主要讲述如何使用Criteria查询distinct后的结果集.
实体:
- public class Authority {
- private Long id;
- private String name;
- // setter getter method ...
- }
- public class User {
- private Long id;
- private String name;
- private Set<AuthorityUserRelation> authorityUserRelation;
- // setter getter method ...
- }
- public class AuthorityUserRelation {
- private User user;
- private Authority authority;
- }
权限Authority实体与用户User实体是ManyToMany单向关系,所有通过查询Authority可以找到多个User对象, 但我们希望distinct结果集。下面我们通过Criteria 完成这个distinct查询。
输入字符串"readOnly" 作为权限名称模糊查询条件, 匹配的用户
示例代码:
- Criteria c = manager.createCriteria(User.class, "user");
- DetachedCriteria dc = DetachedCriteria
- .forClass(AuthorityUserRelation.class, "r")
- .add(Restrictions.eqProperty("user.id", "r.user.id"))
- .setProjection(Projections.id());
- dc.createCriteria("r.authority", "a");
- dc.add(Restrictions.ilike("a.name", "readOnly"));
- c.add(Subqueries.exists(dc));
- List result = c.list();
distinct对象结果集的基本思想就是子查询,子查询根据输入条件查询distinct后对象id,外层内存id查询对象。
warning: 外层查询需要指定alias(本例为"user") , 否则会出现throw new MappingException
编后想: 其实有时候我们只需要模型的单独几个属性, 不需要把所有字段都拽出来,这时候可以用投影,但是投影又是基于数组的访问。不知道什么时候hibernate可以把投影查询的字段映射到模型中,没有查询出来的字段为null。这样做列表就会很轻松了:)
结束了, 欢迎讨论指正。转载请保留作者笔名Heipark