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,指定一些其他宠物中不存在的属性 我怎样才能使这个操作成为可能?如果我尝试进行搜索,当结果不包含属性时,会引发异常。我认为,您尝试的事情是不可能的。但您可以

我的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
将具有所有字段,因此对任何字段执行上述较低级别的查询都将有效

现在,使用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的属性进行搜索,当查询返回没有此属性的对象时,操作将失败。。。