在createCriteria grails中使用配置驱动的逻辑

时间:2013-09-19 07:28:20

标签: grails groovy gorm

我有一个要求,我需要一些标准查询逻辑来配置驱动。之前我常常查询过: e.g:

User.createCriteria().list{
     or{ 
        eq('username',user.username)
        eq('name',user.name)
     }
}

但是,我需要在我的用例中配置它,所以,我尝试这段代码片段。

def criteriaCondition= grailsApplication.config.criteriaCondition?:{user->
         or{
           eq('username',user.username)
           eq('name',user.name)   
         }
}

User.createCriteria().list{criteriaCondition(user)}

但是,这对我不起作用。我错过了方法异常“或”我尝试了一些来源的解决方案,但它对我没用。

所以,任何人都可以帮助我:

1)如何使上面给出的代码工作。 2)我的用例还有其他更好的方法。

提前致谢!!!

2 个答案:

答案 0 :(得分:2)

你必须将criteriaBuilder对象传递给闭包,如下所示:

def criteriaCondition = grailsApplication.config.criteriaCondition ?: { cb, user ->
     cb.or{
       cb.eq('username',user.username)
       cb.eq('name',user.name)   
     }
}

def criteriaBuilder = User.createCriteria()

criteriaBuilder.list{
    criteriaCondition(criteriaBuilder, user)
}

显然,Config.groovy中的闭包也必须具有相同的参数列表,包括cb

答案 1 :(得分:2)

标准构建器机制的工作方式,list方法期望传递一个它将调用的闭包,而您当前的代码调用criteriaCondition闭包本身而不是让标准构建器调用它。 “Currying”会帮助你:给出

def criteriaCondition= grailsApplication.config.criteriaCondition?:{user->
         or{
           eq('username',user.username)
           eq('name',user.name)   
         }
}

而不是说

User.createCriteria().list{criteriaCondition(user)}
你说

User.createCriteria().list(criteriaCondition.curry(user))

(注意圆括号而不是括号)。

curry Closure方法会返回另一个Closure,其中部分或全部参数“预先绑定”到特定值。例如

def add = {a, b -> a + b}
def twoPlus = add.curry(2) // gives a closure equivalent to {b -> 2 + b}
println twoPlus(3) // prints 5

在您的情况下,criteriaCondition.curry(user)为您提供零参数闭包,您可以将其传递给criteria.list。您可以根据需要设置多个参数(直到闭包可以接受的数字)。