说我有以下域对象:
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或加入所有子项
如果top.createdBy!= myUser,则仅加入child.createdBy = myUser的 child (或者可能没有 child )
这是我尝试过的方法(在许多其他失败的变体中):
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(CriteriaSpecification.LEFT_JOIN) {
or {
........
}
未经测试,但是尝试这个
Top.createCriteria().list{
eq('other', myOther)
or {
eq "createdBy", myUser
children(CriteriaSpecification.LEFT_JOIN) {
eq "createdBy", myUser
}
}
}