2017-07-19 33 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 
    } 
    } 

}