Grails / Groovy:在运行时修改“查询”闭包

时间:2012-05-02 20:02:36

标签: grails groovy gorm criteria

在gorm域类中,我可以做到

def q = {
  property1{
    eq('attr', 0)
  }
}

MyDomainClass.list(q)

如何在运行时修改闭包'q'(或创建一个包含闭包'q'限制的新闭包),例如我可以添加另一个属性限制?


更多详情

实际上我的问题是如何在域类层次结构中创建组合标准。

class Parent{
  int pAttr

  static def getCriteria(){
    def dummyParentCriteria = {
      eq('pAttr', 0)
    }
  }
}

class Child extends Parent{
  int cAttr

  static def getCriteria(){
    def dummyChildCriteria = {
      // (1) 
      eq('cAttr', 0)
    }
  }
}

在'dummyChildCriteria'中我想避免重复父母的限制。

我想以某种方式将Parent的getCriteria的结果与(1)

结合起来

具有命名查询继承的解决方案

class Parent{
  int pAttr
  static namedQueries = {
     parentCriteria{
       eq('pAttr', 0)
     }
  }
}

class Child extends Parent {
  int cAttr
  static namedQueries = {
     childCriteria{
       parentCriteria() 
       eq('cAttr', 0)
     }
  }
}

但如果有人知道最初问题的答案,那就很高兴知道了!

1 个答案:

答案 0 :(得分:2)

自Grails 2.0.x以来,您可以使用具有许多用途的 Detached Criteria queries ,包括允许您创建公共可重用标准查询,执行子查询以及执行批量更新/删除。

使用分离条件,您可以使用 Where Queries 进行查询合成。

def parentCriteria = {
    pAttr == 0
}

def childCriteria = {
    cAttr == 0
}

def parentQuery = Parent.where(parentCriteria)
def childQuery = Child.where(parentCriteria && childCriteria)