criteria(2)

Criteria distinct对象结果集

这篇文章是上一篇的续, 主要讲述如何使用Criteria查询distinct后的结果集.

实体:
 
Java代码   收藏代码
  1. public class Authority {     
  2.     
  3.     private Long id;     
  4.     
  5.     private String name;     
  6.       
  7.     // setter getter method ...      
  8. }    
  9.   
  10.   
  11. public class User {     
  12.     
  13.     private Long id;     
  14.     
  15.     private String name;     
  16.     
  17.     private Set<AuthorityUserRelation> authorityUserRelation;  
  18.       
  19.     // setter getter method ...      
  20. }    
  21.   
  22. public class AuthorityUserRelation {  
  23.   
  24.     private User user;  
  25.   
  26.     private Authority authority;  
  27. }  

权限Authority实体与用户User实体是ManyToMany单向关系,所有通过查询Authority可以找到多个User对象, 但我们希望distinct结果集。下面我们通过Criteria 完成这个distinct查询。

输入字符串"readOnly" 作为权限名称模糊查询条件, 匹配的用户

示例代码:
Java代码   收藏代码
  1. Criteria c = manager.createCriteria(User.class"user");  
  2.   
  3. DetachedCriteria dc = DetachedCriteria  
  4.         .forClass(AuthorityUserRelation.class"r")  
  5.         .add(Restrictions.eqProperty("user.id""r.user.id"))  
  6.         .setProjection(Projections.id());  
  7.   
  8. dc.createCriteria("r.authority""a");  
  9. dc.add(Restrictions.ilike("a.name""readOnly"));  
  10.   
  11. c.add(Subqueries.exists(dc));  
  12.   
  13. List result = c.list();  


distinct对象结果集的基本思想就是子查询,子查询根据输入条件查询distinct后对象id,外层内存id查询对象。

warning: 外层查询需要指定alias(本例为"user") , 否则会出现throw new MappingException


编后想: 其实有时候我们只需要模型的单独几个属性, 不需要把所有字段都拽出来,这时候可以用投影,但是投影又是基于数组的访问。不知道什么时候hibernate可以把投影查询的字段映射到模型中,没有查询出来的字段为null。这样做列表就会很轻松了:)

结束了, 欢迎讨论指正。转载请保留作者笔名Heipark
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值