[英]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_authority
是person_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.