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

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

作成:2013-11-09 11:28
更新:2013-11-09 11:28

■比較演算子による検索条件の設定

実は生成されるのは、先にあげた3つだけではありません。これらは単純に「引数の値と完全一致した場合」に検索するものですが、ダイナミックファインダーではその他にもさまざまなメソッドを生成することができます。

ダイナミックファインダーでは、比較演算子がサポートされています。比較演算のための名前をつけたメソッドを自動生成することができるのです。例えば、nameから検索を行う場合、完全一致のものを検索するより、SQLの「LIKE」を利用した検索のほうがより柔軟に探せます。そうした場合には、
def 変数 = SampleData
    .findByNameLike( 検索文字列 );
こんな形でメソッドを呼び出すことで、LIKEによるnameフィールドの検索が可能となります。「findByName」の後に「Like」という比較演算子の名前をつけたメソッドを呼び出せばいいのです。信じられないくらいに安直!

では、どのような比較演算の名前が用意されているのでしょうか。以下にざっと整理しておきましょう。

IsNull――値がnullであるものだけ検索。(引数はありません)
IsNotNull――値がnullではないものを検索。(引数はありません)
NotEqual――引数と等しくないものを検索。
LessThan――引数より小さいものを検索。
LessThanEquals――引数と等しいか小さいものを検索。
GreaterThan――引数より大きいものを検索。
GreaterThanEquals――引数と等しいか大きいものを検索。
Like/Ilike――LIKE(あいまい)検索。Likeは大文字小文字を区別し、Ilike(大文字のiに小文字のLike)は大文字と小文字を区別しない。
Between――2つの引数を用意し、その範囲内の値を検索。
InRange――Betweenと同じだが2つの引数ではなくRangeで指定する。
InList――引数にリストを用意し、そのリストに含まれるものを検索。

かなりいろいろと用意されていますね。例えば「ageの年齢が20歳未満のものを検索」というなら、「findByAgeLessThan(20)」とメソッドを呼び出せばいいわけですね。

また、「find~」というメソッド名につけた場合、1件だけしか検索しないので注意ください。「findAll~」とすれば、検索した全件を取り出すことができます。

実際の利用例を下にあげておきます。これはfindAllByNameLikeを使って検索を行う例です。Likeによる検索の場合、必要に応じてワイルドカード記号(%)をつけるのを忘れないでください。これは引数に自分で用意してやらないといけません。

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

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

●プログラム・リスト●

※likeによるname検索

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

※関連コンテンツ

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