2017-07-19 188 views
0

說我有以下的域對象:的Grails GORM有條件的左外連接

class Top { 
    User createdBy 
    Other other 
    static hasMany = [ 
    children: Child, 
    ] 
} 

class Child { 
    User createdBy 
    static belongsTo = [ 
    top: Top, 
    ] 
} 

並給予用戶MYUSER和其他myOther,我要選擇所有的上衣,其中

top.other.id = myOther.id和
加入所有的孩子如果top.createdBy = MYUSER OR
如果top.createdBy!= MYUSER,只能加入孩子們在那裏child.createdBy = MYUSER(或者無子女)

這是我試過(以及許多其他失敗的變化):

Top.createCriteria().list{ 
    eq('other', myOther) 
    createAlias('children', 'c', JoinType.LEFT_OUTER_JOIN) 
    children { 
    or { 
     isNull('c') 
     eq('createdBy', myUser) 
     and { 
     ne('createdBy', myUser) 
     eq('c.createdBy', myUser) 
     } 
    } 
    } 
} 

但這種失敗「org.hibernate.QueryException:重複協會路徑:兒童」和無用的堆棧跟蹤。

任何提示?提前致謝!

回答

1

您可以通過執行左連接來避免「重複關聯路徑」錯誤,如下所示。並刪除該別名

children(CriteriaSpecification.LEFT_JOIN) { 
    or { 
    ........ 
    } 

未經測試,但嘗試這個

Top.createCriteria().list{ 
    eq('other', myOther) 
    or { 
    eq "createdBy", myUser 
    children(CriteriaSpecification.LEFT_JOIN) { 
     eq "createdBy", myUser 
    } 
    } 

}