1

我很难过,我们将不胜感激。

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 ->
           ...
    }
    ..
}

链接这两个闭包标准和排序的正确方法是什么?

4

1 回答 1

0

问题是“闭包总是返回一个值”。您的criteria闭包正在获取来自查询的上游结果ordering,它没有被定义为接受(Groovy 试图向它提供咖喱值 + 结果来自ordering,总共 3 个参数)。

解决此问题的两种潜在方法:

  1. 您可以通过向您忽略的 aproxFilterClosure 添加另一个一次性参数来解决此问题。

  2. 或者您可以尝试将其包装成这样:

    def x = {Object [] s-> criteria(Arrays.asList(s).subList(0, criteria.maximumNumberOfParameters))}
    

    这将接受任意数量的参数,然后仅使用它可以处理的参数调用您的条件闭包。

我并不是说我喜欢这些想法中的任何一个,但如果这条道路是你前进的道路,它们可能会让你克服你所看到的具体错误。

于 2012-12-07T17:23:11.217 回答