libro
www.tuyano.com
初心者のためのGroovy/Grails入門

ダイナミックファインダーによる検索 (4/5)

作成:2013-11-09 11:32
更新:2013-11-09 11:36

■AND/ORによる複合検索

ここまでの説明は、基本的に1つのプロパティを対象にして検索をするものでしたが、ダイナミックファインダーでは複数のプロパティを検索対象とすることもできます。それには以下のような論理演算子のテキストを使います。

And――論理積(AND)のためのもの。
Or――論理和(OR)のためのもの。

これらは、検索条件を示すテキストをつなぐ形で利用します。つまり「find○○And○○」というような形ですね。○○のところには、「NameLike」というような条件を指定します。例えば、「nameまたはmailに検索テキストを含むものをすべて検索する」という場合ならば、
findAllByNameLikeOrMailLike( 検索文字列1 , 検索文字列2 );
こんな具合になります。OrNameLikeMailLikeをつないでいるわけですね。あわせて引数も変更されています。2つの検索条件をつないでいますので、それぞれに必要な引数をあわせて2つ用意する必要があるのです。(下にサンプルコードを掲載しておきます)

これは、2つだけでなくいくつでもつなげることができます。ただし、注意しないといけないのは、「複数の論理演算子を繋げる場合は、すべて同じ種類でないといけない」という点です。例えば、「nameまたはmailに検索文字を含むもので、ageが20歳未満のものだけを検索する」というなら、
findAllByNameLikeOrMailLikeAndAgeLessThan( 検索文字列1 , 検索文字列2 , 20);
こんな感じになるはずですが、これは使えませんOrAndが混じっているからです。すべてOrか、すべてAndならば動きます。上記のような複雑な検索は、ダイナミックファインダーではなく、また別の方法を考える必要があるでしょう。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

※nameまたはmailから検索

def find = {
    def fstr = params.fstr;
    def datas = null;
    def msg = null;
    if (fstr == null){
        datas = SampleData.getAll();
        msg = "全レコード一覧です。";
    } else {
        datas = SampleData.findAllByNameLikeOrMailLike("%" + fstr + "%","%" + fstr + "%");
        msg = "name & mail like '%" + fstr + "%' のレコード一覧です。";
    }
    def arr = [
        'title':"Show All",
        'msg':msg,
        'datas':datas
    ];
    arr;
}

※関連コンテンツ

「初心者のためのGroovy/Grails入門」に戻る