Grails在抽象域上创建标准

时间:2014-08-28 08:53:16

标签: grails inheritance groovy gorm abstract-class

我很好奇如何使用条件构建器来访问继承类的字段。

我们假设我们有以下课程:

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,我不知道如何将对象与条件构建器连接以获取其字段。

感谢您的阅读。

1 个答案:

答案 0 :(得分:2)

不要期望您的域名模型与其相关的数据库架构之间100%匹配。

在您的情况下,多态性仅适用于AbstractChildClass的tablePerHierarchy true

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

class A { 

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

}

因此您的查询将如下:

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