Low Level API でデータストアにアクセスするで、データストアにデータをPostすることで、以下のようなカインドを作成しました。
ここでいうカインドとは、RDBでいうところのテーブル、エンティティーとはテーブルの行のようなものだということを、こちらで解説しました。
よく出てくる単語なので、わからなかった方は今一度おさらいしておいてください。
今回は反対にLow Level APIを用いて、この作成したカインドからプロパティーを取得する方法を解説します。
JDOを用いてデータストアからデータを保存/取得する方法は以下の記事を参照ください。
JDOをGAEのデータストアに保存/取得する
カインドを取得する方法は主に以下の2つがあります。
・DatastoreServiceのget()メソッドを用いてエンティティーを取得する
・クエリを用いてエンティティーを取得する
両者の大きな違いは、エンティティーをデータストアから取得しにいく際に、前者の場合は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を利用しています。こちらの記事を参照してください。
※保存時の処理は以下記事参照
クエリを用いてエンティティーを取得する
クエリを用いてエンティティーを取得するには、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を使用する方(後者)が扱いやすい印象を受けました。