ダイナミックファインダーによる検索 (4/5)
作成:2013-11-09 11:32
更新:2013-11-09 11:36
更新:2013-11-09 11:36
■AND/ORによる複合検索
ここまでの説明は、基本的に1つのプロパティを対象にして検索をするものでしたが、ダイナミックファインダーでは複数のプロパティを検索対象とすることもできます。それには以下のような論理演算子のテキストを使います。
And――論理積(AND)のためのもの。
Or――論理和(OR)のためのもの。
これらは、検索条件を示すテキストをつなぐ形で利用します。つまり「find○○And○○」というような形ですね。○○のところには、「NameLike」というような条件を指定します。例えば、「nameまたはmailに検索テキストを含むものをすべて検索する」という場合ならば、
これは、2つだけでなくいくつでもつなげることができます。ただし、注意しないといけないのは、「複数の論理演算子を繋げる場合は、すべて同じ種類でないといけない」という点です。例えば、「nameまたはmailに検索文字を含むもので、ageが20歳未満のものだけを検索する」というなら、
And――論理積(AND)のためのもの。
Or――論理和(OR)のためのもの。
これらは、検索条件を示すテキストをつなぐ形で利用します。つまり「find○○And○○」というような形ですね。○○のところには、「NameLike」というような条件を指定します。例えば、「nameまたはmailに検索テキストを含むものをすべて検索する」という場合ならば、
findAllByNameLikeOrMailLike( 検索文字列1 , 検索文字列2 );こんな具合になります。OrでNameLikeとMailLikeをつないでいるわけですね。あわせて引数も変更されています。2つの検索条件をつないでいますので、それぞれに必要な引数をあわせて2つ用意する必要があるのです。(下にサンプルコードを掲載しておきます)
これは、2つだけでなくいくつでもつなげることができます。ただし、注意しないといけないのは、「複数の論理演算子を繋げる場合は、すべて同じ種類でないといけない」という点です。例えば、「nameまたはmailに検索文字を含むもので、ageが20歳未満のものだけを検索する」というなら、
findAllByNameLikeOrMailLikeAndAgeLessThan( 検索文字列1 , 検索文字列2 , 20);こんな感じになるはずですが、これは使えません。OrとAndが混じっているからです。すべてOrか、すべてAndならば動きます。上記のような複雑な検索は、ダイナミックファインダーではなく、また別の方法を考える必要があるでしょう。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
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; }
※関連コンテンツ