Grails的个createCriteria抽象域(Grails createCriteria on

2019-10-20 19:19发布

我很好奇怎么一会用标准Builder访问继承类的字段。

假设我们有下面的类:

class A { 
  String fieldOne 
  String fieldTwo

  static hasMany = [childs: AbstractChildClass]

}

与抽象子类是这样的:

abstract class AbstractChildClass {

  Integer valueOne
  Integer valueTwo
  A a

  static mapping
      tablePerHierarchy false
  }
}

当然也有一些延伸的类,如:

class ExtendingClassOne extends AbstractChildClass {

    DesiredObject desiredObject

    static mapping = {
        tablePerHierarchy false
    }

}

让我们也假设有类DesiredObject看起来像这样:

class DesiredObject {
    String infoA
    String infoB
}

现在的问题是一个如何将通过创建类A的标准,我的做法到目前为止,这是获得INFOA领域和infoB:

A.createCriteria().list {
    childs {
        desiredObject {
            ilike('infoA', '%something%')
        }
    }
}

当然,这并不表中的ExtendingClassOne工作,因为只有desiredObject的ID和我不知道如何加入对象与标准生成器来获得其字段。

谢谢您的阅读。

马尔科

Answer 1:

不要指望你的域模型和数据库架构它关系到之间100%匹配。

在你的情况下,多态性只与工作tablePerHierarchy true的AbstractChildClass。

如果你想坚持tablePerHierarchy false ,你可以定义你的类,如:

class A { 

  static hasMany = [ childrenOne:ExtendingClassOne, childrenTwo:ExtendingClassTwo ]

}

因此,你的查询是简单的:

A.withCriteria{
  for( String c in [ 'childrenOne', 'childrenTwo' ] ){
    "$c"{
      desiredObject {
        ilike('infoA', '%something%')
      }
    }
  }
}


文章来源: Grails createCriteria on abstract domain