今回は、データの検索についてひと通り説明していくことにしましょう。
前回、簡単なサンプルを作成したところで「全データを取り出して表示する」ということを行っていました。これはごく単純なものですが、しかし「データ検索」の基本ともいえることを行っていたのです。これは、以下のようにしてデータを取得していました。
Datastore.query(メタクラス).asList();
「
query」というのは、データベースからモデルのインスタンスを検索するためのクエリを管理する「
ModelQuery」クラスのインスタンスを返すメソッドです。これは引数に指定したメタクラスを元に、指定のモデルクラスを検索するクエリを生成します。
そして「
asList」は、クエリによる検索結果を
Listとして取り出すためのメソッドで、返値はエンティティのインスタンスをまとめた
Listインスタンスとなります。つまり
queryメソッドにより、特定のモデルクラスのデータが検索されるクエリが作られ、
asListによりそれを元に検索が実行されてListが返される、というわけですね。
■filterメソッドについて
これで「指定のモデルクラス全部を得る」という基本はできました。後は、そこから「指定した条件のものだけを絞り込む」という設定を追加するだけなのです。これは「
フィルター」と呼ばれ、
ModelQueryクラス(
queryメソッドで返されるクラス)の「
filter」メソッドを使って設定されます。
Datastore.query(メタクラス).filter( フィルターの設定 ).asList();
filterは、引数にフィルターの設定情報を用意します。これは、「
FilterCriterion」というインターフェイスを使います。このインスタンスをいかに取得するか?が、フィルターのキモといっていいでしょう。
■asSingleについて
この他にもう1つ、覚えておきたいメソッドがあります。それは「
asSingle」です。これは、
asListと対を成すものです。
asListは結果をすべてまとめて
Listにして返すものですが、
asSingleは1つのオブジェクトだけを結果として返します。つまり、複数個を返さないメソッドなのです。これは、例えばIDを使った検索などのように「1つだけしかエンティティはない」というようなときに使います。
もし、
asSingleしたときに複数個のエンティティが見つかっていた場合には
例外が発生しますので、「複数個のエンティティがあってその内の1つを選ぶ」というようなときには使わないほうがよいでしょう。あくまで「1つだけしかエンティティがない」ことが保証されるようなケースで使うもの、と考えたほうが良さそうですね。