如何在JDO中批量处理Google DataStore键查询查询

时间:2010-03-18 05:13:19

标签: java google-app-engine jdo gql jdoql

我有大约50k个实体存储在appengine中。我可以通过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代码时,它什么都不返回。我做错了什么?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

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

即过滤器使用Java语法

答案 2 :(得分:0)

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

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