2. エンティティ検索のサンプル
以下からは、エンティティ検索・参照のサンプル・プログラムを解説します。App Engineデータ・ストアにおける検索・参照処理は、
- キー検索でのデータ検索
- Queryオブジェクトを使用した条件検索
の2種類で行うことができます。最初に、キー検索の方法を解説します。
2.1. キー検索
(1)ルート・エンティティに対するキー検索
キー検索の最も典型的な方式は、ルート・エンティティに対するキー検索です。ここでのサンプルでは、テーブル(kind)を親子(所有・被所有)関係で構成していますが、一般には親子関係を構成しないでテーブルを使用する場合も多く、このような場合のキー検索は、必然的にルート・エンティティに対するキー検索になります。つまり、普通にテーブルを作成して検索する場合は、ルート・エンティティに対するキー検索になります。
【リスト1】: ルート・エンティティに対するキー検索
05 | import com.google.appengine.api.datastore.Cursor; |
06 | import com.google.appengine.api.datastore.DatastoreService; |
07 | import com.google.appengine.api.datastore.DatastoreServiceFactory; |
08 | import com.google.appengine.api.datastore.Entity; |
09 | import com.google.appengine.api.datastore.EntityNotFoundException; |
10 | import com.google.appengine.api.datastore.Key; |
11 | import com.google.appengine.api.datastore.KeyFactory; |
12 | import com.google.appengine.api.datastore.QueryResultList; |
13 | import com.google.appengine.api.datastore.FetchOptions; |
14 | import com.google.appengine.api.datastore.Query; |
15 | import com.google.appengine.api.datastore.Transaction; |
16 | import com.google.appengine.api.datastore.Query.FilterOperator; |
17 | import com.google.appengine.api.datastore.Query.SortDirection; |
20 | DatastoreService ds = DatastoreServiceFactory.getDatastoreService(); |
22 | public String revOrdMas1(String omaskey) { |
24 | Key key = KeyFactory.createKey( "ordMas" , omaskey); |
25 | Entity omas = ds.get(key); |
26 | String lastord = omas.getProperty( "lastord" ).toString(); |
27 | String ordamt = omas.getProperty( "ordamt" ).toString(); |
28 | String out = "{\"lastord\": \"" + lastord + "\", \"ordamt\": \"" + ordamt + "\"}" ; |
30 | } catch (EntityNotFoundException e){ |
31 | return "Error = " + e; |
リスト1は、ルート・エンティティに対するキー検索のサンプルです。最初のimport文には前回説明したトランザクション処理用のパッケージも含まれていますが、全サンプルに共通するため、このあとのサンプルでは省略します。また、DatastoreServiceのインスタンスであるdsの生成についても、以後は省略します。
リスト1のキー検索では、
- (1)createKeyの第1引数にkind名、第2引数にキー名をして、キーを生成します。
- (2)ds(DatastoreServiceのインスタンス)のgetメソッドで、引数に(1)のキーを指定して実行します。
これで、キー指定されたエンティティが取得できます。このように、キー検索によってエンティティを取得するのは簡単です。後は、(3)のように、取得したエンティティ(omas)から、getPropertyメソッドを使ってプロパティ値を取得します。最後に(4)で、JSONフォーマットに変換してクライアントに送信します。
今回は、データ検索のサンプルが多いため、クライアント側の画面表示は解説しませんが、第1回で紹介したDWR(Direct Web Remoting)を使えば、クライアント・サーバー間でのデータ送受信を確認できます。

|
画面1: DWRのメソッド実行画面 |

|
画面2: DWRでの実行結果 |
画面1は、DWRのメソッド実行画面です。この画面上でキー「omas001」を指定して「Execute」ボタンをクリックすると、Webクライアントに送信されるデータが表示されます(画面2)。なお、検索で使うordMasテーブル(kind)は、次のような内容になっています。

|
画面3: ordMasのエンティティ項目 |
2.2. 被所有エンティティのキー検索
【リスト2】: 被所有エンティティのキー検索(revShopMas1)
03 | public String revShopMas1(String omaskey, String smaskey) { |
05 | Key okey = KeyFactory.createKey( "ordMas" , omaskey); |
06 | Key skey = KeyFactory.createKey(okey, "shopMas" , smaskey); |
07 | Entity smas = ds.get(skey); |
08 | String shopamt = smas.getProperty( "shopamt" ).toString(); |
10 | } catch (EntityNotFoundException e){ |
11 | return "Error = " + e; |
被所有、つまり親を持つエンティティをキー検索する場合は、ルート・エンティティでキーを指定する必要があります。リスト2では、(1)でルート・エンティティのキーを取得しています。(2)では、取得したキーをcreateKeyの第1引数に指定して、検索キー(skey)を取得しています。このサンプルでは、検索するエンティティがルート・エンティティ直下のエンティティになっていますが、さらにその下の子エンティティと続く場合は、このような連鎖処理を続ける必要があります。

|
画面4: revShopMas1での検索結果 |
画面4は、revShopMas1の検索結果です。引数にordMasテーブル(ルート・エンティティ)のキー「omas001」とshopMasテーブルのキー「akiba01」を指定して、キー検索結果(受注金額=ordamt)を表示しています。