我的Grails应用程序中有两个域模型
class Pet {
String prop1
String prop2
}
和这个
class Cat extends Pet {
String prop3
String prop4
}
现在,在我的应用程序中,我有许多正在扩展Pets
的类,我想用条件搜索Pet
,指定一些其他宠物不存在的属性。
如何才能实现此操作?如果我尝试进行搜索,当结果不包含该属性时,引发异常。
答案 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
访问prop4
或Pet
,因为它们不是Pet
属性。
考虑到你的课程,我同意Shashank Agrawal的解决方案。 SQL(不是HQL或任何其他GORM查询)是通过查询pet
表来访问所有属性(实际上是列)的唯一方法。当然,这假设您正在使用默认的每层次表继承。它不适用于每子类的表继承。
假设每个层次表的假设意味着您已经在所有Pet
的子类中接受了可空属性。这是一个要求。所以,你可以做的是
Pet
Pet
添加属性以指定宠物类型。请注意,这基本上是table-per-hierarchy已在数据库级别执行的操作。不同之处在于它不是继承,这使得所有属性都可以从Pet
获得。
def pets = Pet.withCriteria { eq('prop3', 'whatever') }