代码之家  ›  专栏  ›  技术社区  ›  Olie

在googleappengine(GAE)上,如何搜索Key/ID字段?

  •  2
  • Olie  · 技术社区  · 15 年前

    我有以下代码(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]
    

    但我不知道它想要什么。我试着搜索jdoid字段,我以为我读到的是一个特殊的名字 __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;
    
    2 回复  |  直到 15 年前
        1
  •  3
  •   Gordon Seidoh Worley    15 年前

    如果您的目标是通过键获取对象,那么应该使用PersistenceManager的getObjectByID()方法。更多细节 here

    另一方面,尝试构造一个查询来通过它的键获取某些东西是不需要做的事情。尽管这是处理SQL数据库的方式,但是Google数据存储的处理方式有所不同,这是其中一种情况,在这种情况下,Google App Engine不必费劲地构造查询,而是让您直接获得所需的内容。毕竟,数据库中应该只有一个实体具有特定的键,因此在这种情况下,GQL查询的其余机器中不需要任何东西,因此可以跳过所有实体以提高效率。

        2
  •  -1
  •   Luxspes    15 年前

    我建议你使用JPA( http://code.google.com/appengine/docs/java/datastore/usingjpa.html )要访问GAE中的数据,有一个非常重要的优势,那就是您可以使用广为人知并有文档记录的JPA标准(及其JPAQL查询语言)以可移植的方式来完成这类工作(如果您坚持JPA标准,那么您的代码将适用于GAE、Hibernate或eclipseelink,而无需修改)

    推荐文章