我有了這個代碼(Java中,GAE):在Google App Engine(GAE)上,如何在密鑰/ ID字段上搜索?
// Much earlier:
playerKey = KeyFactory.keyToString(somePlayer.key);
// Then, later...
PersistenceManager pm = assassin.PMF.get().getPersistenceManager();
Key targetKey = KeyFactory.stringToKey(playerKey);
Query query = pm.newQuery(Player.class);
query.setFilter("__key__ == keyParam");
query.declareParameters("com.google.appengine.api.datastore.Key keyParam");
List<Player> players = (List<Player>) query.execute(targetKey); // <-- line 200
生成該錯誤:
javax.jdo.JDOFatalUserException: Unexpected expression type while parsing query. Are you certain that a field named __key__ exists on your object?
at org.datanucleus.jdo.NucleusJDOHelper.getJDOExceptionForNucleusException(NucleusJDOHelper.java:354)
at org.datanucleus.jdo.JDOQuery.execute(JDOQuery.java:252)
at myapp.Player.validPlayerWithKey(Player.java:200)
// [etc., snip]
但我不知道就是了。我想搜索的JDO id字段,我心想,我讀了特殊的名字__key__
,in the documentation。
我既
query.setFilter("__key__ == keyParam");
和
query.setFilter("ID == keyParam");
具有相同的結果試了一下。那麼,我做錯了什麼?或者更重要的是,我如何正確地做到這一點?
謝謝!
編輯:爲了完整起見,這裏是(我已經接受正確的基礎上登的答案,)最後,工作代碼:
Player result = null;
if (playerKey == null)
{
log.log(Level.WARNING, "Tried to find player with null key.");
}
else
{
PersistenceManager pm = assassin.PMF.get().getPersistenceManager();
try {
result = (Player) pm.getObjectById(Player.class, playerKey);
} catch (javax.jdo.JDOObjectNotFoundException notFound) {
// Player not found; we will return null.
result = null;
}
pm.close();
}
return result;
工程就像一個魅力。我偷了你的答案(但喊着出)在這個類似SO問題:http://stackoverflow.com/questions/3438586/google-app-engine-filter-by-id,希望這是確定。謝謝! – Olie 2010-09-21 21:58:56