用于查找不在另一组结果中的Grails标准(或在Spring中查找非管理员用户)

时间:2012-01-22 12:28:21

标签: grails spring-security gorm

域名支出:

class User {
    String username
    static hasMany = [userRoles: UserRole]
}
class Role {
    String authority
}
class UserRole {
    User user
    Role role
    static belongsTo = [User, Role]
}

这是您安装grails spring-security-core插件时通常会发现的精简版本。

现在,用户可以拥有多个角色。因此,管理员可以是普通用户。用户:UserRole = 1:M

在SQL中,很容易获得一组没有附加用户角色的用户。 如何使用Grails标准构建器来完成它?

作为一个停止差距修复(直到我得到一个很好的答案,基本上没有将SQL插入Grails),我基本上将所有管理员用户作为一组,然后我得到用户列表另一个,并一对一删除所有管理员用户。丑陋,但它的工作原理(慢慢地):

def existing = UserRole.createCriteria().listDistinct {
    eq("role",adminRole)
}.collect{it.user} as Set

def f = User.createCriteria().listDistinct {
    userRoles {
        ne("role",adminRole)
    }
}.collect{it} as Set

existing.each { ex ->
        f.each { non ->
            if (non.id == ex.id) {
                f.remove(non)
            }
        }
}

在上面的代码中,如果你执行f.removeAll(现有),它就不起作用。

我认为这是一个很好的问题,因为您也可以将其应用于其他场景。

提前致谢!

1 个答案:

答案 0 :(得分:2)

我不确定如何使用条件查询来执行此操作,但此HQL有效:

def role = ...
def usersWithoutRole = UserRole.executeQuery(
   'from User u where u not in ' +
       '(select ur.user from UserRole ur where ur.role=:r)',
   [r: role])