繁体   English   中英

Grails:在域类中使用继承进行搜索

[英]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也不prop4Pet仅仅是因为他们没有Pet的属性。

努力寻求解决方案

考虑到你的课程,我同意Shashank Agrawal的解决方案。 SQL(不是HQL或任何其他GORM查询)是通过查询pet表来访问所有属性(实际上是列)的唯一方法。 当然,这假设您正在使用默认的每层次表继承。 它不适用于每子类的表继承。

假设每个层次表的假设意味着你已经在所有Pet的子类中接受了可空属性。 这是一个要求。 所以,你能做的是

  1. 放弃子类
  2. 将所有属性放在Pet
  3. Pet添加属性以指定宠物类型。

请注意,这基本上是每个层次表在数据库级别已经执行的操作。 不同之处在于它不会是继承,这使得Pet可以使用所有属性。

def pets = Pet.withCriteria { eq('prop3', 'whatever') }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM