データストアの検索 (3/5)
作成:2013-12-21 11:27
更新:2013-12-21 11:27
更新:2013-12-21 11:27
■テキストと同じ名前のエンティティを検索する
では、FindControllerを作成しましょう。まずは基本的な検索として、「入力したテキストと同じmynameのMyDataインスタンスを検索する」といったコントローラーを作ってみましょう。
下にサンプルコードを掲載しておきました。実際に/findにアクセスして、入力フィールドに名前を書いて送信してみましょう。その名前のmynameのエンティティがすべて検索され、名前がすべて表示されます(まぁ、同じ名前なのですが)。
ここでは、filterの部分を以下のように記述しています。
フィルターの設定は、検索するエンティティのメタクラスを利用します。メタクラスというのは、エンティティのあるパッケージのmetaパッケージ内に自動生成される「○○Meta」という名前のクラスのことですね。
メタクラスは、getによってインスタンスが取得されますが、このインスタンス内には、そのエンティティに用意されているプロパティ名がそのまま用意されており、更にその中に比較のためのメソッドが用意されていることがわかります。整理すれば、こうなります。
myname――メタクラスに用意されているフィールド名のプロパティ
equal――引数に指定した値と等しいかどうかを調べるEqualCriterionインスタンスを返す
equalは、Objectにあるequalsとは違います。これはフィールドの値と引数の値が等しいかどうかを設定するEqualCriterionを返すメソッドです。このEqualCriterionは、名前から想像がつくようにFilterCriterionインターフェイスを実装しています。
つまり、filterメソッドの引数は、「メタクラスにあるフィールド名のプロパティの中のequalなどのFilterCriterion実装オブジェクトを返すメソッドを使って設定する」というわけです。
下にサンプルコードを掲載しておきました。実際に/findにアクセスして、入力フィールドに名前を書いて送信してみましょう。その名前のmynameのエンティティがすべて検索され、名前がすべて表示されます(まぁ、同じ名前なのですが)。
ここでは、filterの部分を以下のように記述しています。
filter(MyDataMeta.get().myname.equal(s))
フィルターの設定は、検索するエンティティのメタクラスを利用します。メタクラスというのは、エンティティのあるパッケージのmetaパッケージ内に自動生成される「○○Meta」という名前のクラスのことですね。
メタクラスは、getによってインスタンスが取得されますが、このインスタンス内には、そのエンティティに用意されているプロパティ名がそのまま用意されており、更にその中に比較のためのメソッドが用意されていることがわかります。整理すれば、こうなります。
myname――メタクラスに用意されているフィールド名のプロパティ
equal――引数に指定した値と等しいかどうかを調べるEqualCriterionインスタンスを返す
equalは、Objectにあるequalsとは違います。これはフィールドの値と引数の値が等しいかどうかを設定するEqualCriterionを返すメソッドです。このEqualCriterionは、名前から想像がつくようにFilterCriterionインターフェイスを実装しています。
つまり、filterメソッドの引数は、「メタクラスにあるフィールド名のプロパティの中のequalなどのFilterCriterion実装オブジェクトを返すメソッドを使って設定する」というわけです。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
package com.tuyano.libro.myslim3app.controller;
import java.util.List;
import org.slim3.controller.Controller;
import org.slim3.controller.Navigation;
import org.slim3.datastore.Datastore;
import com.tuyano.libro.myslim3app.meta.MyDataMeta;
import com.tuyano.libro.myslim3app.model.MyData;
public class FindController extends Controller {
@Override
public Navigation run() throws Exception {
if (isPost()){
String s = asString("text1");
List<MyData> list = Datastore.query(MyDataMeta.get())
.filter(MyDataMeta.get().myname.equal(s)).asList();
String msg = "データ: ";
for(MyData data : list){
msg += "'" + data.getMyname() + "' ";
}
request.setAttribute("msg", msg);
return forward("find.jsp");
} else {
request.setAttribute("msg", "検索テキストを入力:");
return forward("find.jsp");
}
}
}
※関連コンテンツ