Grails:在另一个闭包中使用多个闭包
我正在根据几个因素创建一个标准。目前,我以以下方式使用嵌套闭包: Utils.groovyGrails:在另一个闭包中使用多个闭包,grails,groovy,closures,criteria,Grails,Groovy,Closures,Criteria,我正在根据几个因素创建一个标准。目前,我以以下方式使用嵌套闭包: Utils.groovy static def statusAndOrderCriteria = { x -> ... Utils.commonOrderCriteria.delegate = delegate Utils.commonOrderCriteria(x) } static def commonOrderCriteria = { x -> ... } 用法: Alert.
static def statusAndOrderCriteria = { x ->
...
Utils.commonOrderCriteria.delegate = delegate
Utils.commonOrderCriteria(x)
}
static def commonOrderCriteria = { x ->
...
}
用法:
Alert.createCriteria().list({
Utils.statusAndOrderCriteria.delegate = delegate
Utils.statusAndOrderCriteria(x)
})
我想使用几个闭包,例如:
Alert.createCriteria().list({
Utils.firstCriteria(a)
Utils.secondCriteria(b)
Utils.statusAndOrderCriteria(x)
})
我不知道如何做到这一点。我知道我不能在同一个闭包上多次覆盖委托对象。构建GORM条件查询时,闭包的委托是
HibernateCriteriaBuilder的一个实例。您可以做的是修改Util
闭包以接受此生成器作为参数。然后,将方法调用委托给生成器。下面是一个例子:
class Utils {
static def statusAndOrderCriteria = { criteriaBuilder, x ->
criteriaBuilder.eq('foo', x)
Utils.commonOrderCriteria(criteriaBuilder, x)
}
static def commonOrderCriteria = { criteriaBuilder, x ->
criteriaBuilder.lt('bar', x)
}
}
然后您可以使用Util
中的静态闭包,如下所示:
Alert.createCriteria().list({
Utils.firstCriteria(delegate, a)
Utils.secondCriteria(delegate, b)
Utils.statusAndOrderCriteria(delegate, x)
})
@groovy.transform.TupleConstructor
class Utils {
HibernateCriteriaBuilder criteriaBuilder
def statusAndOrderCriteria = { x ->
criteriaBuilder.foo()
Utils.commonOrderCriteria(x)
}
def commonOrderCriteria = { x ->
criteriaBuilder.bar()
}
}
Alert.createCriteria().list({
def utils = new Utils(delegate)
utils.firstCriteria(a)
utils.secondCriteria(b)
utils.statusAndOrderCriteria(x)
})
提示:如果闭包不是静态属性,则可以避免不断传递委托,如下所示:
Alert.createCriteria().list({
Utils.firstCriteria(delegate, a)
Utils.secondCriteria(delegate, b)
Utils.statusAndOrderCriteria(delegate, x)
})
@groovy.transform.TupleConstructor
class Utils {
HibernateCriteriaBuilder criteriaBuilder
def statusAndOrderCriteria = { x ->
criteriaBuilder.foo()
Utils.commonOrderCriteria(x)
}
def commonOrderCriteria = { x ->
criteriaBuilder.bar()
}
}
Alert.createCriteria().list({
def utils = new Utils(delegate)
utils.firstCriteria(a)
utils.secondCriteria(b)
utils.statusAndOrderCriteria(x)
})
这太棒了!我必须查找TupleConstructor
注释-对于其他人,它提供了允许“新UTIL(委托)”的构造函数。谢谢。你见过其他内置在ast中的Groovy吗?整个概念就是f*******g太棒了!我只熟悉@Builder
AST这正是我想要的(提示部分)。谢谢!你是Groovy的乐高乐