1

基準クエリのロジックを構成駆動にする必要があるという要件があります。以前は次のようにクエリを実行していました:例:

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)私のユースケースのための他のより良い方法。

前もって感謝します!!!

4

2 に答える 2

2

基準ビルダーのメカニズムが機能するlist方法では、メソッドは呼び出すクロージャーが渡されることを期待していますが、現在のコードはcriteriaCondition、基準ビルダーにクロージャーを呼び出させるのではなく、クロージャー自体を呼び出しています。ここで「カリー化」が役立ちます:

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。好きなだけ引数をカリー化できます (クロージャーが受け入れることができる数まで)。

于 2013-09-19T10:28:41.160 に答える
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

于 2013-09-19T10:21:26.540 に答える