grails独特的投影获取不同项的结果计数

时间:2019-08-29 11:55:38

标签: grails spring-security criteria hibernate-criteria grails-2.0

我正在使用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列表的数量。但是我想要独特的投影计数。

2 个答案:

答案 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
      }
    }
}