grails中hibernate标准生成器中的Join语句

grails中hibernate标准生成器中的Join语句,hibernate,grails,join,Hibernate,Grails,Join,我想用Grails中的HibernateCriteriaBuilder创建以下语句: SELECT * FROM person p JOIN person_authority pa ON p.id=pa.person_id JOIN authority a ON pa.authority_id=a.id WHERE a.authority IN ('ROLE_ADMIN'); person\u authority是联接表 更新: 我的个人课程是: class Person {

我想用Grails中的
HibernateCriteriaBuilder
创建以下语句:

SELECT * FROM person p 
  JOIN person_authority pa ON p.id=pa.person_id 
  JOIN authority a ON pa.authority_id=a.id 
  WHERE a.authority IN ('ROLE_ADMIN');
person\u authority
是联接表

更新:

我的
个人
课程是:

class Person {

transient springSecurityService

Date dateCreated
Date lastLogin

String username
String password
String email;
boolean enabled
boolean accountExpired
boolean accountLocked
boolean passwordExpired

static constraints = {
    username blank: false, unique: true
    email blank:false, unique: true, email: true
    password blank: false
    lastLogin nullable:true
}

static mapping = {
    hasMany authority:Authority;
    password column: '`password`'
}

//Set<Authority> getAuthorities() {
//  PersonAuthority.findAllByPerson(this).collect { it.authority } as Set
//}

def beforeInsert() {
    encodePassword()
}

def beforeUpdate() {
    if (isDirty('password')) {
        encodePassword()
    }
}

protected void encodePassword() {
    password = springSecurityService.encodePassword(password)
}

public static def query(Map params = [:]){

    def rows = withCriteria(max:params.max,offset:params.offset){
        if(params.authorities){
            authorities{
                'in'('authority', params.authorities)
            }
        }
        order(params.column?:"id",params.order?:"asc")
        if(params.id){
            idEq (params.id as Long);
        }
        if(params.username){
            ilike "username","%"+params.username+"%"
        }
        if(params.email){
            ilike "email","%"+params.email+"%"
        }
        if(params.accountLocked){
            eq "accountLocked",Boolean.valueOf(params.accountLocked)
        }
        if(params.enabled){
            eq "enabled",Boolean.valueOf(params.enabled)
        }
        if(params.passwordExpired){
            eq "passwordExpired",Boolean.valueOf(params.passwordExpired)
        }
    }
    return rows;
}
}
班级人员{
临时安全服务
创建日期
上次登录日期
字符串用户名
字符串密码
字符串电子邮件;
布尔启用
布尔帐户已过期
布尔帐户锁定
布尔密码过期
静态约束={
用户名空白:false,唯一:true
电子邮件空白:false,唯一:true,电子邮件:true
密码空白:false
lastLogin可为空:true
}
静态映射={
有很多权威:权威;
密码列:“`password`”
}
//设置getAuthorities(){
//PersonAuthority.findAllByPerson(this).collect{it.authority}作为集合
//}
def beforeInsert(){
encodePassword()
}
def beforeUpdate(){
if(isDirty(‘密码’)){
encodePassword()
}
}
受保护的无效密码(){
password=springSecurityService.encodePassword(密码)
}
公共静态def查询(映射参数=[:]){
def rows=withCriteria(最大值:params.max,偏移量:params.offset){
if(参数权限){
当局{
“in”(“authority”,参数authorities)
}
}
订单(参数列?:“id”,参数订单?:“asc”)
if(参数id){
idEq(参数id为长);
}
if(参数用户名){
我喜欢“用户名”、“%”+参数。用户名+“%”
}
如果(参数电子邮件){
我喜欢“email”,“%”+参数email+“%”
}
如果(参数accountLocked){
等式“accountLocked”,布尔值(参数accountLocked)
}
如果(参数已启用){
等式“已启用”,布尔值(参数已启用)
}
如果(参数密码过期){
等式“passwordExpired”,布尔值(参数passwordExpired)
}
}
返回行;
}
}

我要构建的条件在方法查询中。当我尝试执行它时,我得到了
groovy.lang.MissingMethodException:没有方法签名:grails.orm.HibernateCriteriaBuilder.authorities()适用于参数类型…

这取决于您定义关联的确切方式,但看起来像:

Person.withCriteria {
    authorities {
        'in'('authority', 'ROLE_ADMIN')
    }
}

这取决于您定义关联的准确程度,但看起来像:

Person.withCriteria {
    authorities {
        'in'('authority', 'ROLE_ADMIN')
    }
}

也许,我误读了,但看起来你给你的协会命名了
authority
而不是
authorities

尝试:

您没有列出您的
权限
域类,param.authorities是权限对象列表还是权限的“名称”?如果它是Authority对象,请在不使用join的情况下尝试它(我没有尝试过这个,但我认为它是正确的):

如果它是一个名称列表(并且机构有一个
名称
字段):


也许,我误读了,但看起来你给你的协会命名了
authority
而不是
authorities

尝试:

您没有列出您的
权限
域类,param.authorities是权限对象列表还是权限的“名称”?如果它是Authority对象,请在不使用join的情况下尝试它(我没有尝试过这个,但我认为它是正确的):

如果它是一个名称列表(并且机构有一个
名称
字段):


PersonAuthority.findAllByAuthority(Authority.findbyaauthority(“ROLE_ADMIN”).person
是否可以在HibernateCriteriaBuilder中进行此查询,因为我希望动态附加一些限制(如eqId等)。您可以将其拆分。获取所有角色的权限,然后使用您的筛选器。
PersonAuthority.findAllByAuthority(Authority.findbyaauthority(“ROLE_ADMIN”).person
是否可以在HibernateCriteriaBuilder中进行此查询,因为我希望动态附加一些限制(如eqId等)。你可以这样做。获取所有角色的签名,然后使用你的筛选器。它不起作用。我在第一篇文章中添加了类源。我得到了缺少的方法异常。`groovy.lang.MissingMethodException:没有方法签名:grails.orm.HibernateCriteBuilder.authorities()适用于参数类型…定义“authority”“映射”块之外的关联(最好是复数):static hasMany=[authorities:Authority]不起作用。我在第一篇文章中添加了类源。我得到了缺少的方法异常。`groovy.lang.MissingMethodException:没有方法签名:grails.orm.HibernateCriteBuilder.authorities()适用于参数类型…define“映射”块之外的“authority”关联(复数形式更好):static hasMany=[authorities:authority]
if(params.authorities) {
  'in'('authority', parmas.authorities)
}
if(params.authorities){
    authority{
        'in'('name', params.authorities)
    }
}