2010-03-18 86 views
3

我有大约50k实体存储在appengine中。我能够通过GQL管理界面查找单个记录与查询,如:如何在JDO中执行批量Google DataStore键查询查询

SELECT * FROM Pet where __key__ = KEY('Pet','Fido') 

,但我有麻烦找出如何通过JDO做的这一批版本。现在,我有这样的:

PersistenceManager pm = ...; 
    for(Pet pet : pets) { 
     for(String k : getAllAliases(pet)) { 
      keys.add(KeyFactory.createKeyString(Pet.class.getSimpleName(), k)); 
     } 
    } 
    Query q = pm.newQuery("select from " + Pet.class.getName() + " where id == :keys"); 
    List<Pet> petlist = (List<Pet>) q.execute(keys); 

不过,虽然“菲多”的情况下GQL作品,当我使用的Java + JDO代码它没有返回。我究竟做错了什么?

回答

1

可能在JDOQL情况下不能正常工作,因为它是无效的JDOQL :-P

 
Collection keys = ... (create your keys collection) 
Query q = pm.newQuery("SELECT FROM " + Pet.class.getName() + " WHERE :keys.contains(id)"); 

即过滤器使用Java语法

+0

很高兴知道。如果查询无效,我期待得到某种难以忽略的错误通知,所以我很失望。 – TheDon 2010-03-18 12:20:08

2

不要使用查询获取由关键实体 - 它们效率低下,需要为每个检索到的对象查询!相反,get the objects by key。批量按键提取看起来不被JDO支持,但一次按键提取它们仍然比为它们查询更有效。

+0

我发现很难相信,通过key来单独获取实体会比执行JDO查询更快。我会在某个时候尝试实验。 – TheDon 2010-03-26 01:25:14

+2

'IN'本身不受App Engine的本机支持--SDK通过执行多个顺序查询来模拟它。每个查询都必须执行索引扫描,然后按键查找。相比之下,按键查找只需要做一小部分,因此速度要快得多。 – 2010-03-26 09:49:06