Расход домена:
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 было бы легко получить набор пользователей, если к нему не прикреплена роль пользователя.
Как это сделать с помощью построителя критериев Грааля?
В качестве исправления пробела (до тех пор, пока я не получу хороший ответ, который по сути не включает 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 (существующий), он не работает.
Я думаю, что на этот вопрос было бы неплохо ответить, поскольку вы можете применить то же самое и к другим сценариям.
Заранее спасибо!