【发布时间】:2010-09-21 20:40:00
【问题描述】:
我有这段代码(Java、GAE):
// 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");
结果相同。那么,我做错了什么?或者,更重要的是,我该如何正确地做到这一点?
谢谢!
编辑:为了完整起见,这是最终的工作代码(基于 Gordon 的回答,我认为这是正确的):
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;
【问题讨论】:
标签: google-app-engine jdo