2

Grails (GORM) で Criteria API を使用してクエリを作成したいと考えています。クエリは次のようにする必要があります。

MyEntity.createCriteria().list{
   assoc{
      parent{
         eq("code", val)
      }
   }
}

私が必要とするのは、ネストされたクロージャを String オブジェクトから動的に構築することです。上記の例の文字列は になります"assoc.parent.code"。文字列をドットで分割しましたが(実行してString.split("\\."))、ネストされたクロージャーを構築する方法がわかりません:

   assoc{
      parent{
         eq("code", val)
      }
   }

上記の分割された文字列の配列に基づいて動的に。

4

2 に答える 2

1

より一般的なアプローチはmetaClass、以下のように文字列を使用することであり、それをあらゆる種類のセパレーターなどに使用し
. | , - ~ます。

String.metaClass.convertToClosureWithValue = {op, val ->
    split = delegate.split(op) as List
    if(split.size() == 1) {return "Cannot split string '$delegate' on '$op'"} 

    items = []
    split.each{
        if(it == split.last()){
            items << "{ eq '$it', $val }"
            split.indexOf(it).times{items.push("}")}
        } else {
            items << "{$it"
        }
    }

    println items.join()
    new GroovyShell().evaluate("return " + items.join())
}

assert "assoc.parent.child.name".convertToClosureWithValue(/\./, "John Doe") instanceof Closure
assert "assoc-parent-child-name".convertToClosureWithValue(/\-/, "Billy Bob") instanceof Closure
assert "assoc|parent|child|grandChild|name".convertToClosureWithValue(/\|/, "Max Payne") instanceof Closure
assert "assoc~parent~child~grandChild~name".convertToClosureWithValue('\\~', "Private Ryan") instanceof Closure
assert "assocparentchildname".convertToClosureWithValue(/\|/, "Captain Miller") == "Cannot split string 'assocparentchildname' on '\\|'"

//Print lines from items.join()
{assoc{parent{child{ eq 'name', John Doe }}}}
{assoc{parent{child{ eq 'name', Billy Bob }}}}
{assoc{parent{child{grandChild{ eq 'name', Max Payne }}}}}
{assoc{parent{child{grandChild{ eq 'name', Private Ryan }}}}}
于 2013-06-15T20:01:42.223 に答える