说我有以下域对象:
class Top {
User createdBy
Other other
static hasMany = [
children: Child,
]
}
class Child {
User createdBy
static belongsTo = [
top: Top,
]
}
给予用户myUser和其他myOther,我想选择所有的Tops
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:重复的关联路径:children”和无用的堆栈跟踪失败了。
任何提示?提前谢谢!
答案 0 :(得分:1)
您可以通过执行左连接来避免“重复关联路径”错误,如下所示。并删除别名
children(CriteriaSpecification.LEFT_JOIN) {
or {
........
}
未经测试但请尝试此
Top.createCriteria().list{
eq('other', myOther)
or {
eq "createdBy", myUser
children(CriteriaSpecification.LEFT_JOIN) {
eq "createdBy", myUser
}
}
}
答案 1 :(得分:0)
用于与Grails 3进行条件内部联接
import org.hibernate.criterion.Restrictions
...
...
Top.createCriteria().list{
eq('other', myOther)
createAlias('children', 'c', JoinType.LEFT_OUTER_JOIN, Restrictions.or(Restrictions.eq("c.createdBy", myUser))
ne('createdBy', myUser)
}
这将在条件级别添加条件,并在附近生成与下面相同的sql。
Select
...
...
left outer join
child ch1_
on top_.id=ch1_.id
and (
ch1_.createdBy=?
)
where
top_.createdBy <> ?