我需要在我的应用程序中获取最后10个注册用户(普通用户)以进行统计。该应用程序有两个角色:普通用户和管理员用户。
在我的User类(Spring安全性)中,我有 dateCreated 字段,我可以使用此查询获取控制器中最后10个注册用户:
User.listOrderByDateCreated(max: 10, order: 'desc')
但我只想在普通用户之间获取它,不包括管理员。通过此查询,我可以获得所有普通用户:
UserRole.findAllByRole(role).user
我要运行什么查询?感谢。
答案 0 :(得分: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])
让我知道它是否适合你...... :)
答案 1 :(得分:1)
试试这个:
User.findAllByRole(role,
[max: 10, sort: "dateCreated", order: "desc"])
答案 2 :(得分:1)
令人惊讶的是,这是一个棘手的问题,因为用户没有对角色的直接处理,因此GORM助手没有那么多帮助。使用直接的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' }
}
或者如果您愿意,可以通过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])