Grails GORM条件左外连接

时间:2017-07-19 14:22:35

标签: grails gorm

说我有以下域对象:

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”和无用的堆栈跟踪失败了。

任何提示?提前谢谢!

2 个答案:

答案 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 <> ?