我很难过,我会感激一点帮助......
1)这是有效的
def critQuery = Vlan.createCriteria()
def criteria = criteriaUtil.aproxFilterClosure.curry(Vlan, params)
vlanList = critQuery(criteria)
2)这也有效
def critQuery = Vlan.createCriteria()
def criteria = {eq('dot1qId', 121.toLong())}
def ordering = {order('name','asc')}
def query = criteria << ordering
vlanList = critQuery(query)
3)但这不起作用
def critQuery = Vlan.createCriteria()
def criteria = criteriaUtil.aproxFilterClosure.curry(Vlan, params)
def ordering = {order('name','asc')}
def query = criteria << ordering
vlanList = critQuery(query)
ErrorMsg:没有方法签名:ch.ethz.id.netcenter.common.util.CriteriaUtil $ _closure1.doCall()适用于参数类型:(java.lang.Class ..
class CriteriaUtil {
..
def aproxFilterClosure = {myClass, map ->
...
}
..
}
将两个闭包标准和排序联系起来的正确方法是什么?
答案 0 :(得分:0)
问题在于"Closures always return a value"。您的criteria
闭包正在从ordering
查询中获取上游结果,该查询未定义为接受(Groovy正在尝试向其提供咖喱值+ ordering
的结果,共3个参数)。
两种潜在的黑客攻击方式:
你可以通过向你忽略的aproxFilterClosure添加另一个一次性param来解决这个问题。
或者您可以尝试将其包装成以下内容:
def x = {Object [] s-> criteria(Arrays.asList(s).subList(0, criteria.maximumNumberOfParameters))}
这将接受任意数量的参数,然后只用它可以处理的参数调用你的标准闭包。
我并不是说我喜欢上述任何一种想法,但是如果这条道路是您的前进方向,它们可能会让您了解您所看到的具体错误。