Grails:在域类中使用继承进行搜索
我的Grails应用程序中有这两个域模型Grails:在域类中使用继承进行搜索,grails,gorm,hibernate-criteria,Grails,Gorm,Hibernate Criteria,我的Grails应用程序中有这两个域模型 class Pet { String prop1 String prop2 } 还有这个 class Cat extends Pet { String prop3 String prop4 } 现在,在我的应用程序中,我有许多类正在扩展Pets,我想用条件搜索Pet,指定一些其他宠物中不存在的属性 我怎样才能使这个操作成为可能?如果我尝试进行搜索,当结果不包含属性时,会引发异常。我认为,您尝试的事情是不可能的。但您可以
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
将具有所有字段,因此对任何字段执行上述较低级别的查询都将有效
现在,使用ID获取域实例:
def pets = Pet.getAll(queryResult)
由于面向对象编程的工作方式,您试图做的事情是不可能的
class Foo { }
class Bar extends Foo { }
在本例中,Bar
的实例也是Foo
。但是,Foo
的实例不是一个条
。换句话说,一个超类对它的子类一无所知,而子类知道它的超类
回到您的示例,您无法从Pet
访问prop3
或prop4
,因为它们不是Pet
属性
致力于解决问题
考虑到你们的课程现状,我同意Shashank Agrawal的解决方案。SQL(不是HQL或任何其他GORM查询)是通过查询pet
表来访问所有属性(实际上是列)的唯一方法。当然,这假设您使用的是每个层次结构继承的默认表。它不能处理每个子类的表继承
假设每个层次结构有一个表,这意味着您已经在所有Pet
的子类中接受了可为空的属性。这是一项要求。所以,你能做的就是
Pet
Pet
获得
def pets = Pet.withCriteria { eq('prop3', 'whatever') }
很抱歉我纠正了。谢谢你,沙尚克。你能回答这个问题吗?不,因为我需要从宠物那里进行搜索(带条件)。我有很多宠物(猴子、海豚、狗等)。如果我尝试使用特定pet的属性进行搜索,当查询返回没有此属性的对象时,操作将失败。。。