Хранилище данных google app engine запрос конкретного поля и без дочернего элемента

Я пытаюсь оптимизировать свой GAE. Это моя модель:

Игра: идентификатор, статус, игроки... и список;
Раунд : id , name, desc ... ;

У меня есть взаимосвязь между игрой и раундом: 1-N

Проблема в том, что я не могу запросить игру без его полного раунда или определенного поля.

Я уже пробовал это:

Query query = pm.newQuery(Game.class);
ArrayList<Game> allgame = new ArrayList<Game>();
query.setResult("id, status");
allgame.addAll((Collection<? extends Game>) query.execute());

а также

Query query = pm.newQuery("SELECT id, status FROM com.ws.model.Game");
ArrayList<Object> allgame = new ArrayList<Object>();
allgame.addAll((Collection<? extends Object>) query.execute());

Я использую PersistenceManagerFactory и JDO v1. Я действительно хочу снизить стоимость чтения, не запрашивая все дочерние элементы (раунд)

Спасибо


person Kingstone59    schedule 28.06.2013    source источник


Ответы (1)


Когда объект извлекается из хранилища данных с помощью JDO, извлекается только вызываемая группа выборки. Неиндексированные свойства, включая Text и Blob, по умолчанию не извлекаются. Это означает, что сериализованные значения полей (как ваши объекты Round) не будут извлекаться по умолчанию. Это называется отложенной загрузкой.*

Чтобы получить только определенные поля, вы можете использовать такой запрос:

        query = pm.newQuery("SELECT status, players FROM " +
                Game.class.getName() + " WHERE xy == :xy);

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

Надеюсь это поможет.

*REF: Разработка приложений Google App Engine Java и GWT

person Pablo Chvx    schedule 28.06.2013
comment
Хорошо, это работа. Теперь я понимаю, что значит FetchGroup. По умолчанию было true, меняю на False и все работает @Persistent(mappedBy = gameParent, defaultFetchGroup = false) private List‹Round› roundList = new ArrayList‹Round›(); Но теперь ответом на запрос является объект, как получить поле? - person Kingstone59; 28.06.2013
comment
В яблочко. Вам придется получить поля вручную, примерно так: TYPE fieldvalue = listObject.get(0..n)[0..n]; Я не знаю никакого необычного способа сделать это. - person Pablo Chvx; 28.06.2013
comment
Я не могу получить данные в своем объекте, потому что запрашиваю много полей. - person Kingstone59; 01.07.2013