[英]Grails: Search with inheritance in domain class
我的Grails应用程序中有两个域模型
class Pet {
String prop1
String prop2
}
和这个
class Cat extends Pet {
String prop3
String prop4
}
现在,在我的应用程序中,我有很多类正在扩展Pets
,我想用条件搜索Pet
,指定一些其他宠物不存在的属性。
我怎样才能使这个操作成为可能? 如果我尝试进行搜索,当结果不包含该属性时,引发异常。
我想,你正在努力的事情是不可能的。 但您可以使用两个查询来实现它:
首先做一个较低级别的查询:
// 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)
由于父类Pet
将具有所有字段,因此使用任何字段执行上述较低级别查询将起作用。
现在,使用ids获取域实例:
def pets = Pet.getAll(queryResult)
由于面向对象编程的工作原理,您尝试做的事情是不可能的。
class Foo { }
class Bar extends Foo { }
在这个例子中, Bar
的实例也是 Foo
。 但是, Foo
一个例子不是一个 Bar
。 换句话说,一个超类不知道它的子类,其中一个子类知道其超一流的东西。
回到你的榜样,你不能访问prop3
也不prop4
从Pet
仅仅是因为他们没有Pet
的属性。
考虑到你的课程,我同意Shashank Agrawal的解决方案。 SQL(不是HQL或任何其他GORM查询)是通过查询pet
表来访问所有属性(实际上是列)的唯一方法。 当然,这假设您正在使用默认的每层次表继承。 它不适用于每子类的表继承。
假设每个层次表的假设意味着你已经在所有Pet
的子类中接受了可空属性。 这是一个要求。 所以,你能做的是
Pet
Pet
添加属性以指定宠物类型。 请注意,这基本上是每个层次表在数据库级别已经执行的操作。 不同之处在于它不会是继承,这使得Pet
可以使用所有属性。
def pets = Pet.withCriteria { eq('prop3', 'whatever') }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.