JDO クエリで NotSerializableException

PersistenceManagernewQueryメソッドjavax.jdo.Query を作成して
実行した結果のクエリは、StreamingQueryResult であり
これをそのまま List などにキャストすると、

NotSerializableException:org.datanucleus.store.appengine.query.DatastoreQuery$2
 at com.google.apphosting.runtime.jetty.SessionManager.serialize(SessionManager.java:393)

となってしまう。

NotSerializableException を回避するために、シリアラザイズに直接格納せずに別に取り出す必要がある。

しかたなく、クエリ結果取り出しを StreamingQueryResult の super クラスである
 org.datanucleus.store.query.AbstractQueryResult
にキャストしてからイテレータで取得するしかない

以下の例は、Foo というエンティティでクエリ結果を取得する場合である。

------------------
@Inject  private PersistenceManager pm;
// PersistenceManager は、インジェクトで注入

AbstractQueryResult result = (AbstractQueryResult)this.pm.newQuery(Foo.class).execute();
List<Paper> list = new ArrayList<Paper>();
for(Iterator<?> it=result.iterator();it.hasNext();){
   list.add*1;
}
-----------------
StreamingQueryResult には、public int size()
もあるのでクエリ結果の個数も参照できる

*1:Foo)it.next(