実行した結果のクエリは、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(