Grails:在另一个闭包中使用多个闭包

Grails:在另一个闭包中使用多个闭包,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.

我正在根据几个因素创建一个标准。目前,我以以下方式使用嵌套闭包:

Utils.groovy

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的乐高乐