0

複数のフィルターに基づいて属性を照会し、条件を動的に作成したい

Domain Class
PatientAttr {
   def name
   def value
}

基準 建築基準法

    if(filters.size() != 0 ){
        def criteria =  PatientAttr.createCriteria()
        def results = criteria.list{
            for (item in filters){
                def name = item.name
                def filter = item.filter
                and{
                    eq 'name', name
                    if(filter[0] == "lt")
                        lt ('value', filter[1] as Double)
                    else if(filter[0] == "gt")
                        gt ('value', filter[1] as Double)
                    else 
                        between ('value', filter[0] as Double, filter[1] as Double)
                }
            }
        } 

私が見つけたのは、リストの最後の「and」ステートメントのみが評価されているということです。条件ビルダーを使用すると、条件を動的に作成できますか?

上記のコードはこれと同等でなければなりません

        def results = criteria.list{
            and{
                eq 'name', "Serum albumin (g/dL)"
                gt 'value', 3.5 as Float
            }
            and{    
                eq 'name', "M-spike (g/dL)"
                gt 'value', 2.3 as Float
            }
        }
4

2 に答える 2

1

問題が発生している理由はわかりませんが、クエリのデフォルトの接続詞はであるため、例でクロージャーandを使用する理由はまったくありません。and{}上記のクエリは次と同じです。

    def results = criteria.list{
        eq 'name', "Serum albumin (g/dL)"
        gt 'value', 3.5 as Float
        eq 'name', "M-spike (g/dL)"
        gt 'value', 2.3 as Float
    }

トップレベルのアイテムorをまとめたい場合は、外側のブロックをor{}クロージャーでラップする必要があります。

if(filters.size() != 0 ){
    def criteria =  PatientAttr.createCriteria()
    def results = criteria.list{
        or{
            for (item in filters){
                def name = item.name
                def filter = item.filter
                and{
                    eq 'name', name
                    if(filter[0] == "lt")
                        lt ('value', filter[1] as Double)
                    else if(filter[0] == "gt")
                        gt ('value', filter[1] as Double)
                    else 
                        between ('value', filter[0] as Double, filter[1] as Double)
                }
            }
        }
    } 

これにより、次のような結果を含むクエリが返されます。

名前が「血清アルブミン...」で値が「3.5」より大きい
OR
名前が「M-スパイク...」で値が 2.3 より大きい
OR など

うまくいけば、それは役に立ちます。

于 2012-04-11T20:58:53.227 に答える
0

あなたのブロックによって:

    def results = criteria.list{
        and{
            eq 'name', "Serum albumin (g/dL)"
            gt 'value', 3.5 as Float
        }
        and{    
            eq 'name', "M-spike (g/dL)"
            gt 'value', 2.3 as Float
        }
    }

次のように表現することを意味しますか?

((name == "Serum albumin (g/dL)") or (value == 3.5))
and
((name == "M-spike (g/dL)") or (value == 3.3))

次に、コードは次のようになります。

if(filters.size() != 0 ){
    def criteria =  PatientAttr.createCriteria()
    def results = criteria.list{
        and{
            for (item in filters){
                def name = item.name
                def filter = item.filter
                or {
                    eq 'name', name
                    if(filter[0] == "lt")
                        lt ('value', filter[1] as Double)
                    else if(filter[0] == "gt")
                        gt ('value', filter[1] as Double)
                    else 
                        between ('value', filter[0] as Double, filter[1] as Double)
                }
            }
        }
    } 

あなたが表現するつもりなら:

((name == "Serum albumin (g/dL)") and (value == 3.5))
and
((name == "M-spike (g/dL)") and (value == 3.3))

次に、コードは次のようになります。

if(filters.size() != 0 ){
    def criteria =  PatientAttr.createCriteria()
    def results = criteria.list{
        and{
            for (item in filters){
                def name = item.name
                def filter = item.filter
                eq 'name', name
                if(filter[0] == "lt")
                    lt ('value', filter[1] as Double)
                else if(filter[0] == "gt")
                    gt ('value', filter[1] as Double)
                else 
                    between ('value', filter[0] as Double, filter[1] as Double)
            }
        }
    } 

and はデフォルトの操作であるため、and メソッドは省略できます。

于 2012-04-11T22:21:14.987 に答える