Google App Engine のDataStoreからUserでフィルタリングしてデータを取得する方法

com.google.appengin.api.users.Userをプロパティに持つデータモデルから、それがログイン中のユーザーと一致するものだけを取得しようとする場合。


Python版では、

from google.appengine.api import users
results = Hoge.all().filter('user = ', users.get_current_user())

と、サクッとフィルタリングできたと思ったら、Java版ではそう簡単にはいかない。
大河内教授の憂鬱: GAEでオブジェクト比較
ここを参考にしてやってみたら出来た。

PersistenceManagerFactory pmf = PMF.get(); // SingletonのPersistenceManagerFactory
PersistenceManager pm = pmf.getPersistenceManager();
Query query = pm.newQuery("SELECT FROM " + Hoge.class.getName());
query.setFilter("user == currentUser");
query.declareParameters("com.google.appengine.api.users.UserService currentUser");
Object results = query.execute(UserServiceFactory.getUserService().getCurrentUser());

declareParametersというもので型を教えてあげないといけないらしい。ドキュメントに明記されてるのかなこれ…?探してもよく分からなかった。ちゃんと書いてあった。英語が読めてなかっただけか orz
http://code.google.com/intl/en/appengine/docs/java/datastore/queriesandindexes.html


やっぱりPythonの方が簡単でいいなー、というのが今のところの感想。