grails - Grails:在域类中进行继承搜索

标签 grails gorm hibernate-criteria

我的Grails应用程序中有这两个领域模型(Domain Model)

class Pet {
    String prop1
    String prop2
}

还有这个
class Cat extends Pet {
    String prop3
    String prop4
}

现在,在我的应用程序中,我有许多扩展Pets的类,并且我想使用条件搜索Pet,并指定其他宠物中不存在的某些属性。

如何使该操作成为可能?如果我尝试进行搜索,当结果不包含该属性时,引发异常。

最佳答案

由于面向对象编程的工作原理,您要尝试做的事情是不可能的。

class Foo { }
class Bar extends Foo { }

在此示例中,Bar的实例也是Foo。但是,Foo 的实例不是 Bar。换句话说,父类(super class)对其子类一无所知,而子类却知道其父类(super class)。

回到您的示例,您不能仅通过prop3属性而不是prop4访问PetPet

寻求解决方案

鉴于您的类现状,我同意Shashank Agrawal的解决方案。 SQL(不是HQL或任何其他GORM查询)是通过查询pet表访问所有属性(实际上是列)的唯一方法。当然,这假设您正在使用默认的逐层表继承。它不适用于每个子类的表继承。

假设按表进行分层,则意味着您已经在Pet的所有子类中接受可为空的属性。这是一个要求。所以,你可以做的是
  • 放弃子类
  • 将所有属性放入Pet
  • Pet添加属性以指定宠物类型。

  • 注意,这基本上是table-per-hierarchy在数据库级别已经完成的工作。不同之处在于它不会继承,这使得所有属性都可以从Pet获得。
    def pets = Pet.withCriteria { eq('prop3', 'whatever') }
    

    关于grails - Grails:在域类中进行继承搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34860503/

    相关文章:

    spring - 在单个grails应用程序上有多个域,而在第二个域上只能访问一个特定的 Controller ?

    hibernate - Gorm返回值类型

    grails - Grails查询:获取关联对象列表

    spring - 使用@Convert 按属性过滤条件

    java - Hibernate:获取按 id ASC 排序的最后 N 行

    grails - 我使用 Grails 2.2.1 导入一个项目,并尝试在 2.1.1 Grails 应用程序中使用它。由于错误而失败

    sorting - Grails:多个嵌套关系的分离标准

    spring - 从src/groovy中的类获取对spring bean的引用

    java - Grails war 命令 : what happens behind the scene

    grails - 转发 Action 时没有保存?