Criteria查询 --- 结果集Distinct解决方案2 / 2

Criteria distinct对象结果集

这篇文章是上一篇的续, 主要讲述如何使用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查询对象。

[b][color=red]warning: [/color][/b]外层查询需要指定alias(本例为"user") , 否则会出现throw new MappingException


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

结束了, 欢迎讨论指正。转载请保留作者笔名Heipark

参考资料: http://floledermann.blogspot.com/2007/10/solving-hibernate-criterias-distinct.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值