3

我在 appengine 中存储了大约 50k 个实体。我可以通过 GQL 管理界面使用如下查询查找单个记录:

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);

但是,尽管“Fido”在 GQL 案例中有效,但当我使用该 Java + JDO 代码时它什么也不返回。我究竟做错了什么?

4

3 回答 3

2

不要使用查询来按键获取实体 - 它们效率低下,并且需要对检索到的每个对象进行查询!相反,通过 key 获取对象。JDO 似乎不支持按键批量获取,但是一次按键获取它们仍然比查询它们更有效。

于 2010-03-24T14:18:10.090 回答
1

可能在 JDOQL 案例中不起作用,因为它不是有效的 JDOQL :-P

集合键 = ...(创建您的键集合)
查询 q = pm.newQuery("SELECT FROM " + Pet.class.getName() + " WHERE :keys.contains(id)");

即过滤器使用Java语法

于 2010-03-18T06:26:44.977 回答
0

http://gae-java-persistence.blogspot.com/2009/10/executing-batch-gets.html

我没有尝试 JDO 版本,但 JPA 版本确实有效!

于 2010-06-24T10:00:38.230 回答