Grails在抽象域上创建标准

Grails在抽象域上创建标准,grails,inheritance,groovy,gorm,abstract-class,Grails,Inheritance,Groovy,Gorm,Abstract Class,我很好奇如何使用criteria builder访问继承类的字段 假设我们有以下类: class A { String fieldOne String fieldTwo static hasMany = [childs: AbstractChildClass] } 抽象子类如下所示: abstract class AbstractChildClass { Integer valueOne Integer valueTwo A a static mappi

我很好奇如何使用criteria 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 DesiredObject {
    String infoA
    String infoB
}
当然,有几个扩展类,例如:

class ExtendingClassOne extends AbstractChildClass {

    DesiredObject desiredObject

    static mapping = {
        tablePerHierarchy false
    }

}
我们还假设有一个类DesiredObject,如下所示:

abstract class AbstractChildClass {

  Integer valueOne
  Integer valueTwo
  A a

  static mapping
      tablePerHierarchy false
  }
}
class DesiredObject {
    String infoA
    String infoB
}
问题是如何通过为类a创建标准来获取字段infoA和infoB。到目前为止,我的方法是:

A.createCriteria().list {
    childs {
        desiredObject {
            ilike('infoA', '%something%')
        }
    }
}
这当然不起作用,因为在ExtendingClassOne表中,只有desiredObject的id,我不知道如何将该对象与criteria builder连接以获取其字段

谢谢你的阅读


Marco

不要期望域模型与其相关的DB模式之间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%')
      }
    }
  }
}

谢谢你的回答!不幸的是,我不能改变模型,因为有相当多的扩展类,它们也可能有我想要从中获取字段的子类。我希望有一种比构建自己的SQL查询更优雅的方法。不要用优步设计域模型:)