2016-04-03 8 views
0

Мне нужно, чтобы последние 10 зарегистрированных пользователей (обычных пользователей) в моем приложении для статистики. Приложение имеет две роли: обычный пользователь и пользователь-администратор.Получение последних 10 зарегистрированных пользователей - Весна безопасности Grails

В моем пользователя классе (Spring безопасности), у меня есть dateCreated поле, и я могу получить последние 10 зарегистрированных пользователей в мой контроллер с этим запросом:

User.listOrderByDateCreated(max: 10, order: 'desc') 

Но я просто хочу, чтобы получить его между обычными пользователями, за исключением администратора. С помощью этого запроса я могу получить всех нормальных пользователей:

UserRole.findAllByRole(role).user 

Какой запрос у меня запустить? Благодарю.

ответ

1

Удивительно, что это хитрый, потому что пользователь не имеет прямую ручку на роли, поэтому Горм помощники не помогают, как много. Используя прямую манипуляцию списком Groovy, мы можем получить то, что вы хотите.

def users = User.list().findAll { it.authorities.contains role } 
.sort { it.dateCreated } 
.reverse() 
.take(10) 

//or… 

def users = UserRole.findAllByRole(role).user 
.sort { it.dateCreated } 
.reverse() 
.take(10) 

Однако, если у вас есть большое количество пользователей, это будет неэффективным способом получить 10 из них. Лучшим вариантом может быть использование критериев Hibernate:

def users = UserRole.createCriteria().list(max: 2) { 
    eq "role", role 
    user { 
    order 'dateCreated', 'desc' 
    } 
    projections { property 'user' } 
} 

Или, если вы хотите, вы можете запросить с помощью HQL с помощью executeQuery():

def users = User.executeQuery("from User where id in (select user.id from UserRole where role.id = :roleId) order by dateCreated desc", [roleId: role.id], [max: 10]) 
+0

Да, спасибо. Оно работает!! Хотя критерии меня не срабатывают. Первые символы пользователя и заказа не распознаются. –

+0

Убедитесь, что у вас нет переменной 'user' в области где-то выше ваших критериев (т. Е. Что-либо с' def user = ... '). Я прошёл вчера ночью. :) – ZacharyAKlein

+0

Теперь это работает. Проблема заключалась в роли «экю», роли ». Теперь оба (критерии и HQL) работают. Каков наилучший метод с точки зрения производительности, безопасности и т. Д.? –

1

Попробуйте это:

User.findAllByRole(role, 
       [max: 10, sort: "dateCreated", order: "desc"]) 
+0

Этот запрос не работает, потому что Роль не является полем пользователя. При первом запросе я могу получить всех обычных пользователей (исключая администраторов). Но этот список не фильтруется (max: 10 и sort: dateCreated). –

2

Попробуйте

> User.executeQuery("from User user where user.id in (select userRole.user.id from UserRole userRole where userRole.role.id =:roleId) order by dateCreated desc", [roleId: role.id], [max: 10]) 

Другой путь

UserRole.executeQuery("select ur.user from UserRole ur where ur.role.id =:roleId) order by ur.user.dateCreated desc", [roleId: role.id], [max: 10]) 

Дайте мне знать, если это сработает для вас .. :)

+0

Да, спасибо. Оно работает!! –

+0

Оцените это, если работает для вас. благодаря – Ashu