Как выполнить пакетный запрос на поиск ключей в Google DataStore в JDO - PullRequest
3 голосов
/ 18 марта 2010

У меня в appengine хранится около 50 тысяч объектов. Я могу просмотреть отдельную запись через интерфейс администратора 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 ]

2 голосов
/ 24 марта 2010

Не используйте запросы для извлечения сущностей по ключу - они неэффективны и требуют запроса для каждого полученного объекта! Вместо этого получает объекты по ключу . Массовая выборка по ключу, по-видимому, не поддерживается JDO, но выборка их по ключу по одному все еще будет намного более эффективной, чем выполнение запросов для них.

1 голос
/ 18 марта 2010

Вероятно, не работает в случае JDOQL, так как это недопустимо JDOQL: -P

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

т.е. фильтр использует синтаксис Java

0 голосов
/ 24 июня 2010

http://gae -java-persistence.blogspot.com / 2009/10 / выполнение-периодического gets.html

Я не пробовал версию JDO, но версия JPA работает!

...