2012-12-07 44 views
1

我難倒和一點點的幫助,將不勝感激..Groovy中,Grails的問題與鏈接關閉

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

您可以在使用[命名查詢](http://grails.org/doc/latest/ref/Domain%20Classes/namedQueries.html)後實現目標嗎? –

+0

您似乎在文章中缺少某些錯誤消息。 –

回答

0

問題是"Closures always return a value"。你的criteria閉包得到了來自ordering查詢的上游結果,它沒有被定義爲接受(Groovy試圖爲它提供curried值+來自ordering的結果,總共3個參數)。解決這個黑客的

兩個潛在途徑:

  1. 你可以解決這個問題通過添加另一個一次性參數去你忽略aproxFilterClosure。

  2. 或者你可以嘗試它包裹在這樣的:

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

    這將接受則params的任意數,則只有它能夠處理PARAMS打電話給你的標準關閉。

我並不是說我愛上了這些想法,但他們可能會讓你知道你所看到的具體錯誤,如果這條路是你前進的道路。

+0

我嘗試了你的第一個建議,它工作。你是我的英雄! – Adrian