getObjectsById в App Engine - PullRequest
       29

getObjectsById в App Engine

5 голосов
/ 07 января 2010

Согласно JDO, вы можете использовать PersistenceManager.getObjectsById для загрузки нескольких экземпляров сущностей по их идентификатору объекта.

Какую коллекцию нужно использовать здесь? Ключ хранилища данных Google не работает как идентификатор объекта.

Ответы [ 3 ]

3 голосов
/ 03 февраля 2011

Используйте PersistenceManager.newObjectIdInstance (), как таковой

List<Object> ids = new ArrayList<Object>();
for (Key key : keys) {
   ids.add(pm.newObjectIdInstance(Foo.class, key));
}

return (List<Foo>) pm.getObjectsById(ids);

Я не уверен, однако, насколько дорогой вызов newObjectIdInstance (это не должно быть из того, что я вижу).

2 голосов
/ 07 января 2010

Не прямой ответ, в качестве альтернативы getObjectsById, похоже, что вы можете использовать JDOQL-запрос для загрузки нескольких объектов по ключу :

public List getById(List keys) {
   Query q = pm.newQuery(
      "select from " + Book.class.getName() + " where :keys.contains(key)");
   return (List) q.execute(keys);
}

По-видимому, этот запрос оптимизирован для использования эффективного низкоуровневого массового API.

Однако порядок ключей теряется, поэтому вам придется пересортировать результат в Java land.

0 голосов
/ 27 декабря 2012

Ответ выше меня почти правильный.

Кажется, в синтаксисе, объясненном Google на их сайте разработчиков, есть ошибка.

Объяснил, Google:

// Дайте мне всех сотрудников с lastName равным Смиту или Джонсу Query query = pm.newQuery (Employee.class, ": p.contains (LastName)"); query.execute (Arrays.asList ("Smith", "Jones"));

Конечно, это должно быть:

// Дайте мне всех сотрудников с lastName равным Смиту или Джонсу Query query = pm.newQuery (Employee.class, "P.contains (: LastName)"); query.execute (Arrays.asList ("Smith", "Jones"));

...