Low-Level APIを使ってデータ・ストアを検索する

2011年2月22日(火)
清野 克行

2. エンティティ検索のサンプル

以下からは、エンティティ検索・参照のサンプル・プログラムを解説します。App Engineデータ・ストアにおける検索・参照処理は、

  1. キー検索でのデータ検索
  2. Queryオブジェクトを使用した条件検索

の2種類で行うことができます。最初に、キー検索の方法を解説します。

2.1. キー検索

(1)ルート・エンティティに対するキー検索

キー検索の最も典型的な方式は、ルート・エンティティに対するキー検索です。ここでのサンプルでは、テーブル(kind)を親子(所有・被所有)関係で構成していますが、一般には親子関係を構成しないでテーブルを使用する場合も多く、このような場合のキー検索は、必然的にルート・エンティティに対するキー検索になります。つまり、普通にテーブルを作成して検索する場合は、ルート・エンティティに対するキー検索になります。

【リスト1】: ルート・エンティティに対するキー検索

01<!--//--><![CDATA[// ><!--
02 
03package jdoajax;
04import java.util.*;
05import com.google.appengine.api.datastore.Cursor;
06import com.google.appengine.api.datastore.DatastoreService;
07import com.google.appengine.api.datastore.DatastoreServiceFactory;
08import com.google.appengine.api.datastore.Entity;
09import com.google.appengine.api.datastore.EntityNotFoundException;
10import com.google.appengine.api.datastore.Key;
11import com.google.appengine.api.datastore.KeyFactory;
12import com.google.appengine.api.datastore.QueryResultList;
13import com.google.appengine.api.datastore.FetchOptions;
14import com.google.appengine.api.datastore.Query;
15import com.google.appengine.api.datastore.Transaction;
16import com.google.appengine.api.datastore.Query.FilterOperator;
17import com.google.appengine.api.datastore.Query.SortDirection;
18 
19public class colBean {
20    DatastoreService ds = DatastoreServiceFactory.getDatastoreService();
21
22    public String revOrdMas1(String omaskey) {
23        try{
24            Key key = KeyFactory.createKey("ordMas", omaskey); //(1)
25            Entity omas = ds.get(key); //(2)
26            String lastord = omas.getProperty("lastord").toString(); //(3)
27            String ordamt = omas.getProperty("ordamt").toString(); //(3)
28            String out = "{\"lastord\": \"" + lastord + "\", \"ordamt\": \"" + ordamt + "\"}"; //(4)
29            return out;
30        }catch(EntityNotFoundException e){
31            return "Error = " + e;
32        }
33    }   
34 
35//--><!

リスト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のメソッド実行画面

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

画面2: DWRでの実行結果

画面2: DWRでの実行結果

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

画面3: ordMasのエンティティ項目

画面3: ordMasのエンティティ項目

2.2. 被所有エンティティのキー検索

【リスト2】: 被所有エンティティのキー検索(revShopMas1)

01<!--//--><![CDATA[// ><!--
02 
03public String revShopMas1(String omaskey, String smaskey) {
04    try{
05        Key okey = KeyFactory.createKey("ordMas", omaskey); //(1)
06        Key skey = KeyFactory.createKey(okey, "shopMas", smaskey); //(2)
07        Entity smas = ds.get(skey);
08        String shopamt = smas.getProperty("shopamt").toString();
09        return shopamt;
10    }catch(EntityNotFoundException e){
11        return "Error = " + e;
12    }
13}
14 
15//--><!

被所有、つまり親を持つエンティティをキー検索する場合は、ルート・エンティティでキーを指定する必要があります。リスト2では、(1)でルート・エンティティのキーを取得しています。(2)では、取得したキーをcreateKeyの第1引数に指定して、検索キー(skey)を取得しています。このサンプルでは、検索するエンティティがルート・エンティティ直下のエンティティになっていますが、さらにその下の子エンティティと続く場合は、このような連鎖処理を続ける必要があります。

画面4: revShopMas1での検索結果

画面4: revShopMas1での検索結果

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

有限会社サイバースペース
慶應義塾大学工学部電気科卒。日本IBM、日本HPなどにおいて、製造装置業を中心とした業務系/基幹業務系システムのSE/マーケティングや、3階層C/Sアーキテクチャによる社内業務システム開発などに携わる。現在は、Ajax/Web 2.0関連のセミナー講師/コンサルティング、書籍執筆などを行っている。情報処理学会会員。http://www.at21.net/

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています