基于用户角色和属性的标准

时间:2015-07-20 12:46:27

标签: hibernate grails gorm criteria

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

    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'错误

2 个答案:

答案 0 :(得分:2)

我认为你不需要为此创建别名等。您还可以进一步利用条件构建器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的第一个参数是查询语句,第二个参数是包含要在查询中使用的参数的映射。

答案 1 :(得分:1)

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

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