我正在使用grails-2.5.6版本。我正在使用spring-security-core插件。我在UserRole表上有一个条件查询。我想按角色查找所有不同的用户。它工作正常。但是问题是分页效果。当我指望列表时,它指望的是UserRole列表对象。但是我需要依靠不同的投影项目。有人可以帮我吗?这是我的以下尝试:
def list(Integer max) {
def userInstanceList = UserRole.createCriteria().list(params) {
createAlias('user', 'au')
createAlias('role', 'ar')
projections {
distinct("user")
}
if (params.roleId) {
eq('ar.id', params.getLong("roleId"))
}
}
def totalCount = userInstanceList.totalCount
[userInstanceList: userInstanceList, totalCount: totalCount]
}
在这里,totalCount是UserRole列表的数量。但是我想要独特的投影计数。
答案 0 :(得分:0)
我会稍微不同地解决这个问题,您要分析用户,而不是用户角色。
所以我会做类似的事情:
List<User> usersWithRole = UserRole.createCriteria().list(params) {
role {
eq('id', params.getLong("roleId"))
}
}*.user
int count = usersWithRole.size()
当然,除非有成百上千的用户,在这种情况下,我不想每次都加载所有用户,而是恢复为SQL。
您使用的是Spring Security的自定义版本吗?我从未见过具有基于'long'的ID的角色,通常,键是代表授权机构名称的字符串。
答案 1 :(得分:0)
通常 DBA 将 distinct
关键字的使用视为代码气味。
在您的情况下,我宁愿使用 User
作为主要域对象来运行查询和 group by
子句:
long id = params.getLong "roleId"
def list = User.createCriteria().list( params ) {
projections{
groupProperty 'userRole.role.id'
}
if( id )
userRole{
role{
eq 'id', id
}
}
}