В GoogleEngine (Java), в JDO, как запросить список дочерних объектов на основе идентификатора родителя? - PullRequest
3 голосов
/ 25 февраля 2011

У меня есть два объекта значения, Calendar и Event, которые являются постоянными. Календарь имеет свойство, которое состоит из списка событий, с отношением один ко многим. Календарь является родителем событий, как показано ниже.

@Persistent
@Element(dependent = "true")
private List<Event> events;

Теперь я хотел бы иметь возможность получать с помощью JDO-запроса события, соответствующие календарю, на основе ключа объекта календаря. Я использую кодированный ключ для обоих классов.

Я хочу выполнить запрос к объекту Event, а не просто извлечь весь объект Calendar, потому что я хочу иметь возможность получать только набор событий для целей нумерации страниц.

Я пытался сделать это любым возможным способом, не мог понять, как сделать запрос по родительскому ключу.

Любая помощь будет оценена.

1 Ответ

4 голосов
/ 25 февраля 2011

Несколько заметок:

Свойства списка в сущностях (например, List<Event> events) хранятся в виде сериализованного ProtocolBuffer. Проблема:

  1. Если это свойство проиндексировано, оно ограничено 5000 элементами.

  2. Каждый раз, когда вы запрашиваете список, весь список должен быть десериализован. Это ответ на ваш вопрос , если вы можете выборочно получать элементы списка: вы не можете.

  3. Если у вас есть несколько свойств индексированных списков в сущности, это может привести к взрывным индексам .

Если вы хотите понять внутренности хранилища данных GAE, тогда это видео обязательно: http://www.youtube.com/watch?v=AgaL6NGpkB8

Решения:

  1. Используйте решение из видео Слаткина: сделайте Calendar родителем (в терминах хранилища данных) события. Затем добавьте родительское условие для запроса: Query.setAncestor(Key calendarKey).

    Обновление: Для создания «групп сущностей» должны использоваться родительские отношения сущностей, например единица измерения транзакций.

  2. Обратная ситуация: создайте сущность «Событие», у которой есть свойство «Календарь», указывающее на календарь, которому принадлежит событие. Затем вы можете просто запросить события, которые имеют 'calendar == calendarKey`.

...