我有两个类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,不知道这是重要还是改变了查询数据库的方式。
答案 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);