说我有以下域对象:

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
    }
  }

}

07-24 09:34