気楽なソフト工房

プログラミングについていろいろな記事を書いています。



mykonos2008

Author:mykonos2008
システムエンジニアとして働いている30代の会社員です。
仕事や趣味でプログラムを書いている方の役に立つ記事を書いていきたいと思っています。
ご意見、ご感想はこちらまで
If you are an english speaker,Please visit my english blog.

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
今日は、ユーザが利用できる台帳の一覧を取得する部分を紹介します。
各ログインユーザが利用できる台帳は、「LedgerUser」クラスで管理しています。

@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class LedgerUser {

   @PrimaryKey
   @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
   private Key key;
   
   @Persistent
   private Ledger ledger;
   
   @Persistent
   private User user;

・・・・・・
}

前回の記事でも紹介しましたように「LedgerUser」クラスのエンティティは台帳を
表す「Ledger」クラスのインスタンスを登録する際に、同時にデータストアに登録しています。

ここまで作成した機能では台帳の作成ユーザを、台帳を使用可能なユーザとして登録するように
していますが、後から作成する機能で他のユーザも使用可能なユーザとして登録できるようにします。

JDOのクエリ
本題の台帳一覧の取得ですが、JDOのクエリを使って行います。JDOのクエリは、SQLのクエリと何となく似ているので
そう難しくはありません。上記で紹介した「LedgerUser」クラスのエンティティのうち、「User」プロパティがログインユーザと
一致するインスタンスを取得します。

以下はログインユーザが使用できる台帳の一覧を取得するDaoクラスのメソッドです。

   public List<Ledger> getLedgerList(User user)
   {
      //Initialize PersistenceManager.
      PersistenceManager pm = PMFHelper.get().getPersistenceManager();
      
      List<Ledger> ledgerList = new ArrayList<Ledger>();
      
      //クエリを生成する
      Query query = pm.newQuery(LedgerUser.class,"user == userparam");
      query.declareParameters("com.google.appengine.api.users.User userparam");
        
      try
      {
            @SuppressWarnings("unchecked")
            List<LedgerUser> results = (List<LedgerUser>) query.execute(user);
            
            for(LedgerUser ledgerUser : results)
            {
               Ledger ledger = ledgerUser.getLedger();
               
               //プロパティをロードする
               //これはとても重要。やらないと台帳名がとれません!!
               ledger.getLedgerName();
               ledger.getCreatedBy();
               
               ledgerList.add(ledgerUser.getLedger());
            }
      }
      finally
      {
         query.closeAll();
         pm.close();
      }
      
      return ledgerList;
   }

メソッドの引数はログインユーザの情報を持つUserクラスのインスタンスです。LedgerUserクラスのuserプロパティに対して、それを
指定し、取得するレコードを絞り込んでいます。

クエリの結果は、LedgerUserクラスのリストとして返されます。そのリストからLedgerUserクラスのインスタンスを1つずつ取り出しています。
そして、LedgerUserクラスのインスタンスから目的の「Ledger」クラスのインスタンスを取得し、リストにつめています。

以下の2行は、それぞれ、台帳名と、作成ユーザの情報を取得するために必要な処理です。

ledger.getLedgerName();
ledger.getCreatedBy();

LedgerUserクラスのプロパティである「ledger」はLedgerUserのエンティティがインスタンス化された時点では、
プロパティへの値のロードは行われていません。値が必要になった時点で始めてロードされるのです。

そのため、クエリが開いている間に必要なプロパティを参照しておかないと
Ledgerクラスの該当プロパティはnullのままで値を取得することが出来ません。
私はしばらくこれにはまってしまいました。

コメント

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://csfun.blog49.fc2.com/tb.php/58-ed5d3741

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。