2

特定の属性をフィルタリングする必要のあるオブジェクトがあり、その一部は「null」である可能性もあります。FilterオブジェクトとProductオブジェクトがあります。

Filterオブジェクトには、Productオブジェクトを反映する特定の属性があり、入力することも空白のままにすることもできます。ここにクラスの短縮図があります。

Product: String name, Boolean isEmpty, ...., belongsTo [Producer, Distributor]...


Filter: Boolean isEmpty, ... belongsTo [Producer, Distributor]...

このフィルターを使用すると、特定の属性(空、プロデューサー、ディストリビューター)を持つすべての製品を検索できます。

フィルタを選択できるエクスポート機能があり、製品の選択に基づいて情報が出力されます。

これらの属性はすべてnullになる可能性がありますが、値も含まれるため、最初に独自の検索クエリ(文字列などの組み合わせ)を作成してSQL文字列を作成し、次にProduct.findAll(string_query、string_params)を使用することを考えました。しかし、これは非常に面倒なので、今は次のようなものに変更しました。

if(filter.producer)
    prods = Product.findAllWhere(producer:filter.producer)
if(filter.distributor)
    prods =  prods.findAll {it.distributor == filter.distributor}
if(filter.isEmpty!=null) //as it could be NULL but also false/true
    prods =  prods.findAll {it.isEmpty == filter.isEmpty}

しかし、フィルタリングする属性が10〜15個ある場合、これは非常に大きなタスクになります。GrailsやGroovyの経験はあまりありませんが、これは簡単に解決できると思いますよね?

4

1 に答える 1

5

Grails Criteriaクエリは、このようなタスクを実行するための非常に優れた方法であることがわかると思います。見る:

基準クエリとして表現すると、サンプルは次のようになります。

def prods = Product.createCriteria().list {
    if(filter.producer) eq("producer", filter.producer)
    if(filter.distributor)  eq("distributor", filter.distributor)
    if(filter.isEmpty != null) eq("isEmpty", filter.isEmpty)
}
于 2013-02-13T20:18:10.167 に答える