【问题标题】:Grails Criteria - list contentsGrails 标准 - 列出内容
【发布时间】:2015-04-28 15:26:18
【问题描述】:

这些是我的域对象

User{
 hasMany = {roles: UserRole}
}

UserRole{
  User user
  Role role
}

Role{
  String authority
}

我需要根据角色查找用户。为此,我尝试使用以下标准:

  def role_admin = Role.findByAuthority('ROLE_ADMIN')
  def criteria = new DetachedCriteria(User).build {
    roles{
      role{
        idEq(role_admin.id)
      }
    }
  }

  result.users = criteria.list(params)
  result.total = criteria.count()

上面总是会返回一个结果,即使我已经通过直接查看数据库来验证应该有更多结果。传递给列表的params 是正确的,但我尝试删除它们以确保确定。我看不出上面有什么问题,有什么建议吗?

我也试过了

roles{
    role{
        eq("authority","ROLE_ADMIN")
    }
}

但它正在抛出异常:

“where 子句”中的未知列“role_alias2_.authority”

【问题讨论】:

    标签: grails criteria


    【解决方案1】:

    这对我有用:

    def criteriaUsers = UserRole.createCriteria()
    def users =  criteriaUsers.listDistinct{
                    eq("role", role_admin)
                 }.user
    

    旁注:从您的类的命名来看,您使用的是 spring-security-core 插件。在我看来,hasMany = [roles: UserRole] 是多余的,因为关联 User - Role 已经在 UserRole 类中建模。

    【讨论】:

    • 标准中有更多项目我删除了用于调试,这就是我选择标准的原因
    • 我已经编辑了我的答案,现在我已经使用了标准。
    • 对,这确实有效。任何线索为什么在尝试查询 authority 字段时失败?
    • 我不知道你的语法看起来不错。启用细粒度日志记录以查看您的 sql 查询(在 DataSource.groovy 中)是值得的:datasource { ... logSql = true}。顺便说一句,我希望我的原始帖子确实回答了您的问题。
    • 是的,我最终使用了 eq("role", role_admin) 部分。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-15
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    • 2011-07-20
    • 2014-10-14
    • 1970-01-01
    相关资源
    最近更新 更多