Grails distinct projection 获取不同项目的结果计数
Posted
技术标签:
【中文标题】Grails distinct projection 获取不同项目的结果计数【英文标题】:Grails distinct projection get the result count of distinct items 【发布时间】:2020-01-02 16:49:21 【问题描述】:我使用的是 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 列表的个数。但我想要不同的投影计数。
【问题讨论】:
【参考方案1】:我会稍微不同地解决这个问题,您要分析用户,而不是用户角色。
所以我会这样做:
List<User> usersWithRole = UserRole.createCriteria().list(params)
role
eq('id', params.getLong("roleId"))
*.user
int count = usersWithRole.size()
当然,除非有成百上千的用户,在这种情况下,我不想每次都加载所有用户,而是恢复为 SQL。
这是您正在使用的 Spring Security 的自定义版本吗?我从来没有见过基于“长”ID 的角色,通常,键是代表授权名称的字符串。
【讨论】:
这几乎肯定不是 OP 想要的。这并不能告诉您有多少UserRole
符合条件。 usersWithRole.size()
将告诉您返回了多少,这可能是一个子集,因为 params
被传递给 list
方法。 .totalCount
的意义在于告诉你有多少条记录符合条件,可能超过usersWithRole.size()
。
@JeffScottBrown - 但他写道:“我想在哪里按角色查找所有不同的用户。” - 他的问题有点模棱两可,也许我弄错了,但在我看来,他想要统计所有具有特定角色的用户。
“但在我看来,他希望统计所有具有特定角色的用户。” - 同意。我指出usersWithRole.size()
不是这样做的方法。这将评估结果集中的行数,而不一定是数据库中相应用户的数量。
没错,我应该省略 list 方法中的参数,因为我认为他不太可能真的需要针对用户角色执行分页。很高兴收到 OP 的回复并收到一些额外的细节。
“因为我认为他不太可能真的需要针对用户角色执行分页” - 可能是这种情况,但如果是这样,那么他不应该在他的原始示例。这将导致数据库的另一次往返。如果他真正想要的只是结果集中的元素数量,userInstanceList.size()
比userInstanceList.totalCount
更有意义。【参考方案2】:
通常 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
【讨论】:
以上是关于Grails distinct projection 获取不同项目的结果计数的主要内容,如果未能解决你的问题,请参考以下文章
Grails:Grails3:doWithWebDescriptor?
用于 Grails 2.0 的 Grails/Gradle 插件