我的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
访问Pet
或Pet
。寻求解决方案
鉴于您的类现状,我同意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/