簡體   English   中英

Grails中休眠標准構建器中的Join語句

[英]Join statement in hibernate criteria builder in grails

我想用HibernateCriteriaBuilder在Grails中創建以下語句:

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_authorityperson_authority表。

更新:

我的Person課程是:

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;
}
}

我要建立的條件在方法查詢中。 當我嘗試執行它時,出現groovy.lang.MissingMethodException: No signature of method: grails.orm.HibernateCriteriaBuilder.authorities() is applicable for argument types ...

這取決於您定義關聯的精確程度,但是看起來像:

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

也許,我讀錯了,但看來您是將您的關聯authority命名為authorities

嘗試:

def rows = withCriteria(max:params.max,offset:params.offset){
    if(params.authorities){
        authority{
            'in'('authority', params.authorities)
        }
    }

您沒有列出您的Authority域類,param.authorities是Authority對象列表還是Authority的“名稱”? 如果它是Authority對象,請在不進行聯接的情況下嘗試(我沒有嘗試過,但是我認為這是正確的):

if(params.authorities) {
  'in'('authority', parmas.authorities)
}

如果是名稱列表(並且Authority具有name字段):

if(params.authorities){
    authority{
        'in'('name', params.authorities)
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM