0

名前と値の 2 つのフィールドのみを持つ単純な Tag クラスがあります。

class Tag {
    String name
    String value
}

そして、findBy...Ilike() を介して両方のパラメーターの一部を検索する XML をレンダリングしようとしています。

def getXml = {
    render Tag.findAllByNameAndValueIlike("%${params.name}%", "%${params.value}%") as XML
}

しかし、これは私の結果を与えません。パラメータを 1 つだけ使用すると、期待どおりに動作します。

def getXml = {
    render Tag.findAllByNameIlike("%${params.name}%") as XML
}

私の次の質問は、おそらく結果をフィルタリングし、他の「類似の」タグを返品リストに追加することになるので、上記を次のような方法で解決する方法はありますか?

def getXml = {
    list = Tag.findAllByNameIlike("%${params.name}%")
    list.add(Some other stuff)
    list.sortBy(Some thing, maby name length)
}
4

3 に答える 3

2

複数フィールドのilikeクエリには、次を使用できますwithCriteria

def result = Tag.withCriteria {
    ilike('name', "%${params.name}%")
    ilike('value', "%${params.value}%")
}

Tagこれにより、名前が指定された名前一致し、値が指定された値と一致するドメインのリストが返されます。

Criteria DSLを使用すると、必要なフィルタリングのほとんどを行うことができますが、ここで Groovy コレクションの例をいくつか使用することも検討できます。

于 2012-12-05T20:54:55.163 に答える
1

動的ファインダーの各フィールドに制限 (InList、NotNull など) を設定する必要があります。そうでない場合は、等しいと見なされます。これがあなたが探していたものです:

Tag.findAllByNameIlikeAndValueIlike("%${params.name}%", "%${params.value}%")

于 2012-12-06T01:39:20.903 に答える
1

両方の答えは良いです。両方試しましたが、withcCritia が一番気に入っています。とても柔軟に見えます。

    def result = Tag.withCriteria {
        if(params.name != null)
            ilike('name', "%${params.name}%")
        if(params.value != null)
            ilike('value', "%${params.value}%")
    }
    result.add(new Tag('name': "something"))
    render result as XML
于 2012-12-09T13:46:58.703 に答える