2016-11-07 4 views
0

を避けるために、どのように任意のアイデアは、ここであれば、ここでのステ​​ートメント

User.createCriteria().list(offset: filter.offset, max: filter.max) { 
     if (filter.first-name) eq('firstName', filter.first-name) 
     if (filter.last-name) eq('lastName', filter.last-name) 
     if (filter.email) eq('email', filter.email) 
     if (filter.status) eq('status', filter.status) 
     if (...) ... 
     . 
     . 
     order(filter.sort, 'desc') 
     order('name') 
    } 

がここifのを避けるためにどのような方法がありますが、コードのですか?

+1

groovy 3値オペレータを使用できます。 –

答えて

1

地図についてはどうですか?

User.createCriteria().list(offset: filter.offset, max: filter.max) { 
    [ 
     'firstName' : filter.first-name, 
     'lastName' : filter.last-name, 
     'email'  : filter.email, 
     'status' : filter.status 
    ].findAll { it.value }.each { eq it.key, it.value } 

    order(filter.sort, 'desc') 
    order('name') 
} 

プロパティ名を単純にリストすると、さらに動的になります。


更新:どのキーとしてクロージャを使用してはどうですか?

User.createCriteria().list(offset: filter.offset, max: filter.max) { 
    [ 
     { eq 'firstName', it } : filter.first-name, 
     { eq 'lastName', it } : filter.last-name, 
     { eq 'email', it }  : filter.email, 
     { eq 'status', it } : filter.status, 
     { lt 'dob', it }  : filter.dob 
    ].findAll { it.value }.each { it.key(it.value) } 

    order(filter.sort, 'desc') 
    order('name') 
} 

私はit paramはあなたが検索可能なアイテムのマップが含まれており、このような何かを試みることができるcurry

+0

実際、私のケースでは、キーとプロパティ名が異なります。しかし、それは同じにすることができます。別の問題は、私が必要としているのは単にeqではないということです。 「ilike」、「ne」、ある協会の財産などのようにいくつかありますが、とにかくそれは良い考えです。 +1 –

+0

@AdeelAnsariが別の解決策で更新されました – Will

+0

あなたはそれがもっと読めなくなってきていると思いませんか? –

1

のようなものを使用して抽象化することができ、それもあまり読みやすくするために、あまり繰り返し信じる:

filter.searchList=[first-name:'firstName',last-name:'lastName', 
email:'email', status:'status'] 
User.createCriteria().list(offset: filter.offset, max: filter.max) { 
    filter.searchList?.each { k,v -> 
     !(filter."${k}" ?: eq(v, filter."${k}") 
    } 
    . 
    . 
    order(filter.sort, 'desc') 
    order('name') 
} 
+0

ご意見ありがとうございます。 –

関連する問題