域名支出:
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(现有),它就不起作用。
我认为这是一个很好的问题,因为您也可以将其应用于其他场景。
提前致谢!
答案 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])