【问题标题】:Is it possible to metaprogram named queries onto a grails domain class?是否可以将命名查询元编程到 grails 域类上?
【发布时间】:2011-08-30 06:21:20
【问题描述】:

是否可以将命名查询元编程到 grails 域类上?如果有,怎么做?

谢谢

【问题讨论】:

  • 你到底是什么意思?如果您有一个包含“first”和“last”字段的域类,grails 会通过元编程自动为您添加 findByFirst、findByLast、findByFirstAndLast....
  • 具体来说,我想使用插件在域类上“添加”status 字段。但是,status 是一个单独的域,通过软键链接到域类(请参阅审计日志)。我想添加一些命名查询并允许 findAllByStatus(fooStatus).otherNamedQuery().list()

标签: grails metaprogramming named-query


【解决方案1】:

域类有一个namedQueries 属性,您可以使用该属性添加您自己的命名查询。如果您想在插件中使用元编程(而不是直接编辑域类)来执行此操作,您应该在插件描述符文件的doWithDynamicMethods 闭包中执行此操作。

这样的事情应该可以工作:

class MyPlugin {

  def doWithDynamicMethods = { applicationContext ->

    application.domainClasses.each { domainClass -> 

      boolean domainClassFilter = domainClass as Boolean

      if (domainClassFilter) {
        domainClass.metaClass.static.myNamedQuery = {->  

          // implementation of your named query goes here. Here is an example implementation
          // that returns all instances with status == 'ready'
          String simpleClassName = domainClass.simpleName
          domainClass.findAll("from $simpleClassName where status = ?", ['ready'])
        } 
      }
    } 
  } 
}

这会将myNamedQuery添加到安装插件的应用程序中的每个域类中。如果您只想将其添加到某些域类中,请将domainClassFilter的值替换为更合适的测试。

【讨论】:

  • 向域类添加动态方法,而不是命名查询。
猜你喜欢
  • 2014-03-22
  • 1970-01-01
  • 1970-01-01
  • 2016-01-13
  • 2016-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多