Критерии Grails для поиска не в другом наборе результатов (или в поиске пользователей без прав администратора в Spring) - PullRequest
0 голосов
/ 22 января 2012

Расход домена:

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 (существующий), он не работает.

Я думаю, что на этот вопрос было бы неплохо ответить, поскольку вы можете применить то же самое и к другим сценариям.

Заранее спасибо!

1 Ответ

2 голосов
/ 22 января 2012

Я не уверен, как это сделать с помощью критерия запроса, но этот 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])
...