嵌套选择的Hibernate Criteria

时间:2011-01-05 12:51:29

标签: java sql hibernate criteria

我有sql select我想要写标准。我在谷歌搜索一段时间,但无法找到任何“不在”的东西。 我的SQL查询:

select * from users where username not in(
select users.username from users right join authorities on users.username=authorities.username 
where authority='ROLE_ADMIN')  

提前多多感谢。 问候, 垫

2 个答案:

答案 0 :(得分:3)

感谢您的回答,但这并不完全是这样的。您选择了具有权限“ROLE_ADMIN”的所有用户,并且我需要所有不是“ROLE_ADMIN”的用户。 smple“not”无法正常工作,因为有些用户一次拥有“ROLE_ADMIN”和“ROLE_MODERATOR”。我设法解决了这个问题:

DetachedCriteria subCriteria = DetachedCriteria.forClass(Authorities.class);
subCriteria.add(Property.forName("authority").ne(authorityName));
subCriteria.setProjection(Projections.property("users"));

DetachedCriteria criteria = DetachedCriteria.forClass(getPersistentClass());
criteria.add(Property.forName("username").notIn(subCriteria));
return getHibernateTemplate().findByCriteria(criteria);

它有效,但你认为这是一个很好的解决方案吗?

答案 1 :(得分:0)

您应该在Hibernate映射

中将权限映射为类用户的属性
<many-to-one name="authority" class="Authority" column="AUTHORITY_ID"

之后,可以轻松构建条件查询:

List users = sess.createCriteria(User.class)
.createCriteria("authority")
.add( Restrictions.eq("authority_name", "ROLE_ADMIN") )
.list