我创建了一个条件来获取具有特定角色(候选角色)的用户,并使用其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'
错误
答案 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
中生效。