Grails:在域类中使用继承进行搜索

时间:2016-01-18 17:20:22

标签: grails gorm hibernate-criteria

我的Grails应用程序中有两个域模型

class Pet {
    String prop1
    String prop2
}

和这个

class Cat extends Pet {
    String prop3
    String prop4
}

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

如何才能实现此操作?如果我尝试进行搜索,当结果不包含该属性时,引发异常。

2 个答案:

答案 0 :(得分:2)

我认为,你正在尝试的事情是不可能的。但是你可以使用两个查询来实现它:

首先进行较低级别的查询:

substr()

由于父类// Inject the bean def sessionFactory String statement = "select id from pet where prop1 = 'foo' or prop3 = 'bar'"; def session = sessionFactory.getCurrentSession() def queryResult = session.createSQLQuery(statement) 将包含所有字段,因此使用任何字段进行上述较低级别查询都可以。

现在,使用ids获取域实例:

Pet

答案 1 :(得分:1)

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

class Foo { }
class Bar extends Foo { }

在此示例中,Bar 的实例也是 Foo。但是,Foo 的实例不是 Bar。换句话说,超类不会知道关于其子类的任何内容,其中作为子类知道关于其超类。

回到您的示例,您无法从prop3访问prop4Pet,因为它们不是Pet属性。

努力寻求解决方案

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

假设每个层次表的假设意味着您已经在所有Pet的子类中接受了可空属性。这是一个要求。所以,你可以做的是

  1. 放弃子类
  2. 将所有属性放入Pet
  3. Pet添加属性以指定宠物类型。
  4. 请注意,这基本上是table-per-hierarchy已在数据库级别执行的操作。不同之处在于它不是继承,这使得所有属性都可以从Pet获得。

    def pets = Pet.withCriteria { eq('prop3', 'whatever') }
    
相关问题