grails - 如何将隐式参数传递给Grails中的Closure?

标签 grails groovy closures gorm

我有许多具有相同逻辑的查询,因此我决定将其提取到闭包中。

这是一个例子:

Closure whereByProjectIdAndUser = { Criteria cr, Long projectId, User user ->
    Long userId = user.id
    Boolean isReviewer = user.isReviewer()

    cr.isNull 'project.deletedAt'
    cr.eq 'project.id', projectId

    (cr | {
        cr.eq 'owner.id', userId

        if (isReviewer) {
            cr & {
                cr.eq 'reviewer.id', userId
                cr.ne 'project.certificationStatus', ProjectCertificationStatus.None
            }
        }
    })
}

@Transactional(readOnly = true)
RrmUtilization[] getAllByProjectIdAndUser(Long projectId, User user) {

    BuildableCriteria cr = RrmUtilization.createCriteria()
    RrmUtilization[] result = cr.list {
        createAlias('project', 'project', JoinType.INNER_JOIN)
        createAlias('project.owner', 'owner', JoinType.INNER_JOIN)
        createAlias('project.reviewer', 'reviewer', JoinType.LEFT_OUTER_JOIN)

        isNull 'deletedAt'

        whereByProjectIdAndUser(cr, projectId, user)

    } as RrmUtilization[]

    result
}

这很好,但是,我试图了解如何避免将BuildableCriteria显式传递给闭包?有没有办法让它隐式传递并获得更好的代码?

也许总体上有一些更好的方法?

最佳答案

您可以使用关键字this来访问闭包的封闭类中的参数。

Groovy文档:http://groovy-lang.org/closures.html#closure-owner

关于grails - 如何将隐式参数传递给Grails中的Closure?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55883147/

相关文章:

grails - 运行Grails CLI : No profile found for name [web].时发生错误(使用--stacktrace查看完整跟踪)

grails - NetBeans-11无法设置为使用Grails

validation - Controller Grails 中的电子邮件验证

javascript - 避免闭包引起的 jQuery Mobile 内存泄漏

javascript - 在 Javascript 中访问私有(private)实例变量的静态公共(public)方法

hibernate - 将Hibernate SELECT语句记录到自己的日志文件中

grails - ASCII字符使用grails 3中的任意字符进行转换(附加)

ios - 在 Swift 闭包中使用 [weak self] 和赋值

unit-testing - Grails Spock单元测试不一致

java - 在 Groovy 中实现 Object-JSON 映射的标准方法是什么?