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 插件

如何使用 grails 命令行编译 grails 项目?

是否可以在 Grails 之外使用 Grails 验证?如何?

Grails:企业级 Grails [关闭]

Grails - grails.converters.JSON - 删除类名