クエリを用いて検索条件を指定する


Google App Engine では、データストアを用いてデータの保存と取り出しを行うことができます。
本サイトでも、以下の記事でデータストアについて解説しています。

今回は、Low Level APIの一つであるQueryクラスを用いて、条件に一致したデータをデータストアから取得する方法について解説します。

今回は上記リンクを参考に、あらかじめ下図のようにデータを格納したデータストアから、条件を絞って情報を取得して画面に表示します。

[使用するデータストア構成]
カインド(テーブル)名 :QuerySpace
プロパティー(列)   :name(名前)、age(年齢)、gender(性別)
エンティティー(レコード) :8個(hanako〜tarou)

ポイントは以下の点です。

  • QueryクラスのaddFilterメソッドを用いて条件を絞る
  • 複数条件を指定する
  • 同じくQueryクラスのaddSortメソッドを用いて検索結果を並び替える

それでは続きをどうぞ

条件を設定して検索する

Queryクラスを用いて検索を行う手順は以下の通りです。

  1. DatastoreServiceクラスのインスタンスを生成
  2. Queryクラスのインスタンスを生成
  3. QueryクラスのaddFilterメソッドを用いて条件を指定
  4. 作成したクエリからPrepareQueryクラスのオブジェクトを生成
  5. PrepareQueryクラスのオブジェクトからEntityを取り出す

それではソースコードを見てみます。

QueryServlet.java

public class QueryServlet extends HttpServlet {
	public void doGet(HttpServletRequest req, HttpServletResponse resp)
	throws IOException {

		Velocity.init();

		// 1.DatastoreServiceクラスのインスタンスを生成
		DatastoreService ds = DatastoreServiceFactory.getDatastoreService();

		// 2.Queryクラスのインスタンスを生成
		// 引き数にカインド名を指定
		Query query = new Query("QuerySpace");

		// 3.QueryクラスのaddFilterメソッドを用いて条件を指定
		query.addFilter("gender", FilterOperator.EQUAL, "man");

		// 4.作成したクエリからPrepareQueryクラスのオブジェクトを生成
		PreparedQuery pQuery = ds.prepare(query);

		List querylist = new ArrayList();
		// 5.PrepareQueryクラスのオブジェクトからEntityを取り出す
		for(Entity entity: pQuery.asIterable()){
			String name = entity.getProperty("name").toString();
			String age = entity.getProperty("age").toString();
			String gender = entity.getProperty("gender").toString();
			String str = name + "/" + age +  "/" + gender;
			querylist.add(str);
		}

		// 表示部
		VelocityContext vContext = new VelocityContext();
		vContext.put("queryList", querylist);

		resp.setContentType("text/html");
		resp.setCharacterEncoding("utf-8");

		Template template = Velocity.getTemplate("WEB-INF/querydisp.vm", "Shift-JIS");
		template.merge(vContext, resp.getWriter());
	}
}

まず10行目でQueryクラスのインスタンスを取得しています。
引数には検索を行う対象のカインドを指定しています。
カインドとは、一般的なデータベースでいうところのテーブルのようなものです(詳しくはLow Level APIでGAEのデータストアにアクセスするを参照)。
13行目で検索条件を指定しています。
addFilterメソッドの各引数は以下の通りです。
[table “192” not found /]

ここでは、”gender”プロパティーが”man”(パラメータ)と同じ(FilterOperator.EQUAL)データだけを取得するようにします。
15行目で、作成したクエリを用いてPreparedQueryクラスのインスタンスを取得しています。
データストアにアクセスし、条件に合ったエンティティーが返されます。
19〜25行目で、PreparedQueryクラスのインスタンスからEntityを取り出し、取り出したEntityから各プロパティーの値を取得しています。

最後に、28行目以降でVelocity Templateを利用してデザイナへのバインドを行います。

これで、下図のようにデータが取得できます。

”gender”プロパティーが”man”のデータだけが取得できていることがわかります。

条件の複数指定とソートを行う

次に、検索条件を複数指定する方法と、検索結果のソートを行う方法について解説します。
検索条件を複数指定する方法は非常に単純で、addFilterメソッドを複数指定するだけです。

QueryServlet.java

		// 検索条件を複数指定
		query.addFilter("gender", FilterOperator.EQUAL, "man")
			 .addFilter("age", FilterOperator.LESS_THAN, 20);

ソート条件を指定するには、QueryクラスのaddSortメソッドを用います。

QueryServlet.java

		// 検索条件を複数指定
		query.addFilter("gender", FilterOperator.EQUAL, "man")
			 .addFilter("age", FilterOperator.LESS_THAN, 20);

		// ソートの設定
		query.addSort("age", SortDirection.DESCENDING);

addSortメソッドの第一引数にはプロパティーを、第2引数には昇順(SortDirection.ASCENDING)もしくは降順(SortDirection.DESCENDING)を指定します。

以上のように設定すると、以下のようにデータが取得できます。

“gender”プロパティーが”man”でかつ”age”プロパティーが20以下のデータのみ取得できていることがわかります。
さらに、”age”が大きい順にソートされています。

以上のように、メソッドを利用して簡単に条件を指定して検索および並び替えを行うことが可能です。

One Comment