【问题标题】:Criteria based on User's Role and attributes基于用户角色和属性的标准
【发布时间】:2015-10-09 14:25:25
【问题描述】:

我创建了一个标准来获取具有特定角色(候选角色)的用户,并使用其用户名属性。这是我使用的标准:

    def userRoleList = UserRole.createCriteria().list(max: params.max,offset: params.offset){
        createAlias("user","u")
        addToCriteria(Restrictions.ilike("u.username",name,MatchMode.ANYWHERE))
        eq("role",Role.findByAuthority("ROLE_CANDIDATE"))
        if(userType==1){
            addToCriteria(Restrictions.eq("u.deleted",1))
        }else if(userType==2){
            addToCriteria(Restrictions.eq("u.deleted",0))
        }
    }

    def userList = userRoleList*.user

我收到错误 Unknown column 'u1_.username' in 'where clause' 错误

【问题讨论】:

  • 我相信 ilike 区分大小写 - 可能是这样吗?
  • 哪个版本的 Grails?

标签: hibernate grails grails-orm criteria


【解决方案1】:

我认为您不需要为此创建别名等。您还可以进一步利用标准构建器 DSL 来指定限制。例如,

def userList = UserRole.createCriteria().list(max: params.max,offset: params.offset){
  eq("role",Role.findByAuthority("ROLE_CANDIDATE"))
  user {
    ilike('username','%' + name + '%')
    if (userType == 1){
        eq("deleted", 1)
    } else if(userType == 2){
        eq("deleted", 0)
    }
  }
}*.user

上面似乎是 Grails 或 Hibernate 的错误/功能的受害者,如果有问题的表使用复合键,则会导致失败。就像 UserRole(来自 SpringSecurity 插件)所做的那样。

另一种方法是使用 HQL - 上面的等价物可以写成

def userList = UserRole.executeQuery("select user from UserRole " +
            "where role_id = ? " +
            "and lower(username) like ? " +
            "and deleted = ?",[Role.findByAuthority("ROLE_CANDIDATE")?.id,
                               "%" + name.toLowerCase() + "%",
                               userType == 1 ? 1 : 0])

executeQuery 的第一个参数是查询语句,第二个参数是包含要在查询中使用的参数的映射。

【讨论】:

  • 获取 MissingMethodException。没有方法签名:com.assesmart.user.User.call() 适用于参数类型:(com.assesmart.user.UserController$_index_closure1_closure11) 在“user {”行。
【解决方案2】:

您正在调用 Restrictions 上的静态方法,这些方法返回未在任何地方使用的表达式实例。

调用实例方法(省略Restrictions.),以便它们在正在构建的Criteria 中生效。

【讨论】:

  • 我试过 createAlias("user","u"); ilike("u.username", name);但它在 createCriteria() 行中给出了 NPE。我也试过 addToCriteria(Restric..) 但它也不起作用。
  • 是否传入namenull?
  • 不,它要么是空白(“”),要么包含一些值。
  • 好的。我实际上在“where 子句”错误中得到了未知列“u1_.username”。
猜你喜欢
  • 2013-07-08
  • 1970-01-01
  • 2020-10-24
  • 2016-05-19
  • 2014-02-13
  • 2012-01-20
  • 1970-01-01
  • 2020-06-17
  • 2011-08-25
相关资源
最近更新 更多