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

2つのクロージャ基準と順序を連鎖させる正しい方法は何でしょうか?

4

1 に答える 1

0

問題は、「クロージャーは常に値を返す」ことです。あなたのcriteriaクロージャーは、受け入れるように定義されていないクエリから上流の結果を供給されています(Groovyは、合計3つの orderingパラメーターに対して、カリー化された値+ からの結果を供給しようとしています)。ordering

これをハッキングする 2 つの潜在的な方法:

  1. 無視する aproxFilterClosure に別の使い捨てパラメーターを追加することで、これを回避できます。

  2. または、次のようにラップしてみてください。

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

    これは、任意の数のパラメーターを受け入れ、処理できるパラメーターのみを使用して基準クロージャーを呼び出します。

私は、これらのアイデアのいずれかに恋をしているわけではありませんが、この道があなたの進むべき道であれば、あなたが見ている特定のエラーを乗り越えることができるかもしれません.

于 2012-12-07T17:23:11.217 に答える