ひがやすを技術ブログ

電通国際情報サービスのプログラマ

GAE/Jでbatch get

unownedなone to manyの関連があるとき、many側は、次のようにKey(Primary KeyであればString, Longでもいい)のリストとして定義します。


List fooKeys;
fooKeysからListを取得したいわけですが、これまで、JDOとしてはいい感じのやり方がありませんでした。PersistenceManagerにgetObjectsById(Collection oids) : Collectionというそれっぽいやつはあるのですが、ここででてくるoidsとは、KeyのCollectionではなく、JDOHelper.getObjectIds(Collection pcs)の結果なので、今回やりたいこととは違います。


Low level APIでは、DatastoreService#get(Iteratable keys) : Iteratableがあるので、これに相当する機能がJDOでも欲しいわけです。それを実現するのは実は簡単で、次のようにやります。


Query query = pm.newQuery(Foo.class);
query.setFilter("key == :keys");
List fooList = (List) query.execute(fooKeys);
この"=="を"in"のように使う機能は、Primary Keyでのみ可能です。Slim3 JDOで書けば、次のような感じ。

FooMeta f = new FooMeta();
List fooList = from(f).where(f.key.eq(fooKeys)).getResultList();

Slim3でFlex連携

Slim3Flexと連携するサンプルを追加しました。まだ、データを取ってくるだけですが、日曜日には更新機能もつけます。
http://higayasuo.appspot.com/
BlazeDS(AMF)を使わない、HTTPServiceだけを使ったシンプルなソリューションです。GAEでAMFを使うのは、BlazeDSのソースを直したりと四苦八苦するので、余りお勧めではありません。


追記:CRUDの機能を実装しました。
http://higayasuo.appspot.com/flexblog/

追記:現在はflexblogのアプリケーションは削除されています。