ダイナミックファインダーによる検索 (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;
}
※関連コンテンツ