2017-10-17 10 views
0

私はコードの下のブロックのように見えるように、この上のブロックを抽象化しようとしています。grailsの基準メソッドのクロージャを返すカスタム関数を作成する方法

if (params.xId) { 
    and { 
     'in'(aggregateClassReference, hierarchy['x']) 
     eq(aggregateIdReference, params.xId as Long) 
    } 
} 
if (params.yId) { 
    and { 
     'in'(aggregateReference, hierarchy['y']) 
     eq(aggregateIdReference, params.yId as Long) 
    } 
} 

...

if (params.xId) { belongsToHierarchy('x', params.xId as Long) } 
if (params.yId) { belongsToHierarchy('y', params.yId as Long) } 

私はGORM基準クエリを使用していますが、私は、コードのこれらの大きな塊を望んでいません。これらの条件クエリのクロージャをカスタム関数で返す方法はありますか?問題は、今私が

def criteria = DetachedCriteria.build(...) 

にコードの下の塊を入れている。その後、私は実行するために

criteria.list(...) 

を行います。何とかビルド内のカスタム機能でちょうど

and { 
    'in'{...} 
    eq {...} 
} 

の閉鎖を返すために素晴らしいことだろうが、私はまだそれを把握することができていません。 grailsに少し新しい。私を導くどんな洞察も大いに評価されるでしょう:)

+1

おそらく名前付き問合せは役立つかもしれませんか?あなたはそれらを調べましたか? http://docs.grails.org/latest/ref/Domain%20Classes/namedQueries.html –

答えて

1

これについてはいくつかの方法があります。あなたは、あなたがやっていることに最善の解決策があることを正確に把握するのに十分な状況を示していませんが、そこにあるものを与えれば、役立つかもしれない何かを示すことができます。

あなたの代わりにこのようなもので、その後の基準クエリを使用したい場合は...

def results = SomeDomainClass.withCriteria { 
    if (params.xId) { 
     and { 
      'in'(aggregateClassReference, hierarchy['x']) 
      eq(aggregateIdReference, params.xId as Long) 
     } 
    } 
    if (params.yId) { 
     and { 
      'in'(aggregateReference, hierarchy['y']) 
      eq(aggregateIdReference, params.yId as Long) 
     } 
    } 
} 

あなたはこのような何かを行うことができ...

def results = SomeDomainClass.withCriteria { 
    if (params.xId) { 
     belongsToHierarchy 'x', params.long('xId'), delegate 
    } 
    if (params.yId) { 
     belongsToHierarchy 'y', params.long('yId'), delegate 
    } 
} 

// ... 

// it isn't clear from your example if 
// aggregateClassReference and hierarchy are local 
// variables in the context where the criteria 
// query is being initialized or if they are 
// instance variables. If they are instance variables 
// the code below will work. If they are local 
// variables then they might need to be passed as 
// arguments into this belongsToHierarchy method... 

void belongsToHierarchy(String arg, long id, delegate) { 
    def query = { 
     // not sure why you had the "and" in your example, but 
     // I will leave it here assuming there is a reason... 
     and { 
      'in' aggregateClassReference, hierarchy[arg] 
      eq aggregateIdReference, id 
     } 
    } 
    query.delegate = delegate 
    query() 
} 
+0

質問で使用したのが基準クエリです。問題で明確ではないいくつかの詳細に応じて、いくつかの素晴らしい利点を持つ別のオプションは、分離された条件クエリが構成可能であるという事実を利用することかもしれません。 –

関連する問題