使用Hibernate Criteria API查询实体没有特定值的多对多关联

时间:2011-08-29 19:56:06

标签: java hibernate many-to-many criteria-api

我有两个类User和Role,它们使用多对多关联映射到彼此。现在我正在尝试使用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链接它们的所有角色,因为以后可能会动态添加更多角色。

更新

为了更好地了解我的场景,您可以在another question中看到我想要查询的关联。

此外,我还要补充一点,Role类的name属性是一个Enum,不知道这是重要还是改变了查询数据库的方式。

1 个答案:

答案 0 :(得分: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);