0

パラメータのリストがあり、そこからクエリを作成したいと考えています。実際、私はすでにその作業を終えており、今ではリファクタリングしようとしている巨大なメソッドがあります。1 つの巨大なメソッドを多数の小さなメソッドに分割し、それらを 1 つのメソッドとして結合する方法が必要です。

動的クエリ リクエストの作成中に問題が発生し、アドバイスが必要です。

そこで、ドキュメント「6.4.4 Detached Criteria」( http://grails.org/doc/2.2.4/guide/GORM.html#detachedCriteria )を調べました。

「サブクエリに切り離された基準を使用する」の章で、次のサンプルが見つかりました。

def results = Person.withCriteria {
 gt "age", new DetachedCriteria(Person).build {
     projections {
         avg "age"
     }
 }
 order "firstName"
}

そして、DetachedCriteria をアナログとして返すいくつかのメソッドを作成しようとしました。たとえば、次のようになります。

DetachedCriteria insertCriteriaLong(def objClass, String cleanKey, def e) {
    new DetachedCriteria(objClass).build {
        if (e.key.toString().endsWith("_from")) {
            gte(cleanKey, e.value as Long)
        } else if (e.key.toString().endsWith("_to")) {
            lte(cleanKey, e.value as Long)
        } else {
            eq(cleanKey, e.value as Long)
        }
    }
}

デバッグ中に、そのメソッドが DetachedCriteria オブジェクトを作成し、正しいフィルター (基準) ルールで埋めていることがわかりました。

しかし、メインリクエスト内からこのメソッドを呼び出そうとしましたが、結果として基準がありません。

    def cr = new DetachedCriteria(objClass).build { 
        insertCriteriaLong(objClass, cleanKey, e)
    }
    cr.list(params)

そして、「cr.list(params)」は多くのレコードを返します。「insertCriteriaLong」は無視されました。

そのため、書き直して Criteria または単に Closure を返すことを考えましたが、まだ正しい構文が見つかりません。たとえば、私は試しました:

Closure insertCriteriaInteger2 = { String cleanKey, def e ->
    if (e.key.toString().endsWith("_from")) {
        gte(cleanKey, e.value as Integer)
    } else if (e.key.toString().endsWith("_to")) {
        lte(cleanKey, e.value as Integer)
    } else {
        eq(cleanKey, e.value as Integer)
    }
}

他に何を試すべきか、ヒントを教えてください。

似たような次の質問を見つけましたが、私には役に立ちません: Grails/Groovy: 実行時に「クエリ」クロージャーを変更する

4

1 に答える 1