我有一个要求,我需要一些标准查询逻辑来配置驱动。之前我常常查询过: 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)我的用例还有其他更好的方法。
提前致谢!!!
答案 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
。您可以根据需要设置多个参数(直到闭包可以接受的数字)。