2011-08-29 44 views
0

我有两个使用多对多关联映射到彼此的User和Role类。现在我试图使用Hibernate Criteria API来查询所有没有特定角色的用户。但我有点卡住了。使用Hibernate Criteria API查询实体没有特定值的多对多关联

要查询具有特定角色的用户,请使用以下查询,该查询工作得很好。

Session session = getSessionFactory().getCurrentSession();   
Criteria mainCrit = session.createCriteria(boClass); 
return mainCrit.createAlias("roles", "r").add(Restrictions.eq("r.name", roleName)).list(); 

现在我有点困惑如何扭转查询并获取所有没有特定角色的用户。如果可能的话,我希望明确排除某个角色,并且不要查询所有使用OR链接角色的角色,因为可能会动态添加更多角色。

UPDATE

为了更好地了解我的情况下,你可以看到我试图在another question查询的关联。

此外,我还会补充说,Role类的name属性是一个Enum,不知道这是否重要,或者更改查询数据库的方式。

回答

2

也许有一种更优雅的方式,但是我发现的唯一方法是查询所有用户,在用户的角色中没有任何角色具有给定的角色名称。

这是这样完成的:

Criteria c = session.createCriteria(User.class, "user"); 

DetachedCriteria roleOfUserWithName = DetachedCriteria.forClass(Role.class, "role"); 
roleOfUserWithName.createAlias("role.users", "userOfTheRole"); 
roleOfUserWithName.add(Restrictions.eqProperty("userOfTheRole.id", "user.id")); 
roleOfUserWithName.add(Restrictions.eq("role.name", roleName); 
roleOfUserWithName.setProjection(Projections.id()); 

c.add(Subqueries.notExists(roleOfUserWithName)); 

它等效于下面的HQL查询:

select user from User user where not exists (
    select role.id from Role role inner join role.users userOfTheRole 
    where userOfTheRole.id = user.id 
    and role.name = :roleName); 
+0

遗憾的是它并没有为我工作。无论是标准还是HQL版本。我试图查询关联形式[这个问题](http://stackoverflow.com/questions/7248668/hibernate-many-to-many-association-left-hand-side-collection-contains-elements/7249604# 7249604)。问题出在我改变了我的社团之后,就像你在回答这个问题时所建议的那样。我在这个问题中提到查询具有某个角色的用户的查询不再起作用。不,我完全困惑我做错了什么。 – Flo

+0

更明确。你的意思是“不起作用”?它会产生错误吗? SQL是否正确生成?它返回什么? –

+0

不,它不会产生错误。首先更改了行'roleName.setProjection(Projections.id());'到'roleOfUserWithName.setProjection(Projections.id());'。我的测试场景:我创建了3个用户和2个角色(Admin,User)。第一个用户获取管理员角色,第二个用户获取这两个角色,最后一个用户获取用户角色。然后我将用户添加到关联(角色)的另一侧并保存所有对象。所以对于这种情况,查询应该返回没有管理员角色的用户。所以在这种情况下,只有具有用户角色的最后一个用户应该被返回。但查询返回的列表是空的。 – Flo

相关问题