grails - 在抽象域上使用Grails createCriteria

标签 grails inheritance groovy gorm abstract-class

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

假设我们有以下类(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中只是所需对象的ID,我不知道如何将对象与条件构建器结合起来以获取其字段。

感谢您的阅读。

马可

最佳答案

不要期望您的域模型与其相关的数据库架构之间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%')
      }
    }
  }
}

关于grails - 在抽象域上使用Grails createCriteria,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25544648/

相关文章:

grails - 无法使用 AnglurJS 和 Geb 设置输入文本字段

Java:我该如何解决错误: "implicit super constructor is undefined"

debugging - 如何调试Grails中发送的参数

Grails 功能测试 - grailsApplication.config 在 Controller 和服务中为空

Java 继承 - 尝试创建通用方法从 Guava EventBus 库获取总线

c++ - 是否建议让所有类都继承自 C++ 中的基类?

groovy - 在 SoapUI groovy 脚本中获取上一个测试步骤的名称

jenkins - 如何从groovy脚本运行jenkins作业

class - Grails类的初始化

grails - 如何在Grails 4中的创建和编辑表单中添加多个枚举字段?