Low Level API でデータストアからデータを取得する


Low Level API でデータストアにアクセスするで、データストアにデータをPostすることで、以下のようなカインドを作成しました。

ここでいうカインドとは、RDBでいうところのテーブル、エンティティーとはテーブルの行のようなものだということを、こちらで解説しました。
よく出てくる単語なので、わからなかった方は今一度おさらいしておいてください。
今回は反対にLow Level APIを用いて、この作成したカインドからプロパティーを取得する方法を解説します。

JDOを用いてデータストアからデータを保存/取得する方法は以下の記事を参照ください。
JDOをGAEのデータストアに保存/取得する

カインドを取得する方法は主に以下の2つがあります。
DatastoreServiceget()メソッドを用いてエンティティーを取得する
クエリを用いてエンティティーを取得する
両者の大きな違いは、エンティティーをデータストアから取得しにいく際に、前者の場合はKeyを用いるのに比べ、後者はカインド名を用います(後述)。

それぞれについて見ていきたいと思います。

それでは続きをどうぞ

DatastoreServiceのget()メソッドを用いてエンティティーを取得する

まずはDatastoreServiceクラスのget()メソッドを用いてエンティティーを取得する方法から解説します。
データストアにデータを保存する際は、doPost()メソッド内に処理を記述しましたが、データストアからデータを取得する場合は、doGet()メソッド内に処理を記述します。

public class LawLevelGetSampleServlet extends HttpServlet {
	public void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws IOException {
		(...省略...)
		//DatastoreServiceのget()メソッドを用いてエンティティーを取得する
		String name = "";
		Key key = KeyFactory.createKey("TechKind", 1);
		try {
			Entity entity = ds.get(key);
			Object obj = entity.getProperty("name");
			name = obj.toString();
		} catch (EntityNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

9行目で、get()メソッドを利用してエンティティーを取得しています。
引数には取得したいエンティティーのKeyを指定します。
7行目でそのKeyを生成しています。引数に指定するカインド名とidは、保存時※のものと同じものを指定する必要があります。

あとは 4行目で、取得したエンティティーから、EntityクラスのプロパティーをgetProperty()メソッドを利用して、Objectクラスのインスタンスとして取得し、String型に変換して表示するだけです。

なお、今回はブラウザへの表示にVelocityを利用しています。こちらの記事を参照してください。

※保存時の処理は以下記事参照

Low Level API でデータストアにアクセスする

クエリを用いてエンティティーを取得する

クエリを用いてエンティティーを取得するには、Queryクラスを利用します。
Queryクラスのインスタンスを取得する際に、コンストラクタの引数にカインド名を指定します。
Queryクラスからエンティティーを取得するには、QueryのインスタンスからPreparedQueryクラスのインスタンスを生成します。
DatastoreServiceクラスのprepare()メソッドの引数に、Queryクラスのインスタンスを指定することで生成できます(6行目)。

public class LawLevelGetSampleServlet extends HttpServlet {
	public void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws IOException {
		(...省略...)
		//Queryを用いてエンティティーを取得する
 		Query query = new Query("TechKind");
 		PreparedQuery pQuery = ds.prepare(query);
 		Entity entity = pQuery.asSingleEntity();
		Object object = entity.getProperty("name");
		String name = object.toString();
	}
}

PreparedQueryクラスのインスタンスを取得したら、そこからエンティティーを取得します(4行目)。
PreparedQueryクラスのasSingleEntity()メソッドは、該当するエンティティーを一つだけ取得します。
今回はTechKindカインドには一つだけエンティティーが含まれているので、それを取得することができます。
※エンティティーが複数含まれている場合のQueryの振る舞いについては、次々回あたりに別途解説したいと思います。

エンティティーを取得できたら、そこからプロパティーを取得する方法は前節で解説した方法と同じです。

以上がデータストアからデータを取得する方法です。

まとめ

今回、2種類の方法を用いて、データストアからデータを取得しました。
どちらを使うのがよいか、というのは特にはありません。
しかし、get()メソッドを利用する場合(前者の方法)、カインド内にエンティティーが増えてきたときに、Keyを管理するのが大変かもしれません。
一方で、Queryを用いる(後者)方法では、カインド名のみ指定してエンティティーを取得することができるので、文字列のみの管理で済みます。
そういう意味では、Queryを使用する方(後者)が扱いやすい印象を受けました。

One Comment