ひがやすを技術ブログ

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

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();