Fle*_*tch 5 grails groovy grails-orm
我在Grails中有两个非常相似的方法,比如"通过os计算统计数据"和"通过浏览器计算统计数据" - 有效地准备一些东西,然后在数据库上运行类似的查询,然后对结果做一些事情.方法不同的唯一部分是它们在我的方法中运行的查询 -
def summary = c.list {
eq('browser', Browser.get(1)) // OR eq('os', OS.get(1))
between('date', dates.start, dates.end)
}
Run Code Online (Sandbox Code Playgroud)
在我看来,重构它的理想方法是将闭包的第一行作为方法参数传递.喜欢
doStats (Closure query) {
...
def summary = c.list {
query
between('date', dates.start, dates.end)
}
}
Run Code Online (Sandbox Code Playgroud)
我试过这个,但"查询"被忽略了.我尝试使用query()但是然后在定义的地方执行查询子句,因此这也不起作用.我想我可以将整个闭包作为参数传递,但这似乎是错误的 - 查询可能在将来变得更复杂.
有没有更好的想法?
我发现leftShift
operator 对于从两个单独的闭包组合闭包很有用。你可以做的是:
Closure a = { /*...*/ }
Closure b = { /*...*/ }
Closure c = a << b
Run Code Online (Sandbox Code Playgroud)
看看这个例子:
def criteria = {
projection Projections.distinct(Projections.property('id'))
and {
eq 'owner.id', userDetails.id
if (filter.groupId) {
eq 'group.id', filter.groupId
}
}
}
List<Long> ids = Contact.createCriteria().list(criteria << {
maxResults filter.max
firstResult filter.offset
})
Integer totalCount = Contact.createCriteria().count(criteria)
Run Code Online (Sandbox Code Playgroud)
您可以在这里看到的是,我正在创建一个criteria
用于列出蚂蚁计数 GORM 对象的列表。两种情况的标准几乎相同,但为了列出目的,我还需要包括命令对象的限制和偏移量。
您使用的标准 DSL 可能与普通的常规闭包不同。
\n\n要执行您所要求的操作,您可以使用此处描述的方法 -
\n\nhttp://mrhaki.blogspot.com/2010/06/grails-goodness-refactoring-criteria.html
\n\n并将您的查询放入私有方法中。
\n\n更优雅的解决方案是在 grails 中使用命名查询 -
\n\nhttp://grails.org/doc/latest/ref/Domain%20Classes/namedQueries.html
\n\n看着那(这
\n\n recentPublicationsWithBookInTitle {\n // calls to other named queries\xe2\x80\xa6\n recentPublications()\n publicationsWithBookInTitle()\n }\n
Run Code Online (Sandbox Code Playgroud)\n\n例子 -
\n 归档时间: |
|
查看次数: |
3479 次 |
最近记录: |