Запрос в транзакции с фильтром предков в Google App Engine (Java) - PullRequest
2 голосов
/ 02 ноября 2009

В документации Java говорится, что приложение может выполнять запрос во время транзакции, но только если оно включает фильтр предка, но нет документации о том, как это сделать. Кто-нибудь может предоставить пример кода, который показывает, как сделать это максимально кратким способом?

Ответы [ 3 ]

2 голосов
/ 04 ноября 2012

Я боролся с этим некоторое время, но следующее будет работать! Короткий ответ заключается в том, что JDO, используемый с App Engine, может определенно поддерживать запросы Ancestor, поэтому вам не нужно прибегать к низкоуровневому API, уникальному для App Engine, особенно в случае, когда вы хотите придерживаться JDO во всем приложении.

Шаг 1:

В дочернем классе убедитесь, что указана следующая переменная экземпляра. Фактическое имя переменной не имеет значения. Что важно, так это аннотация.

@Persistent
@Extension(vendorName="datanucleus", key="gae.parent-pk", value="true")
private String mParentEncKey;

Шаг 2:

При запросе дочернего объекта (объектов) по родительскому ключу вы хотите затем выполнить фильтрацию parentKey по имени созданной вами переменной экземпляра ... в этом случае Этот пример предназначен для того, чтобы запросить набор дочерних объектов, которые имеют свойство, учитывая, что вы знаете родительский ключ и это свойство.

public static List<ChildObject> queryYourChildObjects(String parentKey, String someProperty) {

        PersistenceManager pm = PMF.get().getPersistenceManager();
        Query q = pm.newQuery(ChildObject.class);
        q.setFilter("mParentEncKey == parentKeyParam && property == propertyParam");
        q.declareParameters("String parentKeyParam, String propertyParam");
        List<ChildObject> results = (List<ChildObject>) q.execute(parentKey, someProperty);
        return results;
    }

Вот и все! Надеюсь, это поможет.

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

Попробуйте этот подход:

// PersistenceManager pm = ...;
Transaction tx = pm.currentTransaction();
User user = userService.currentUser();
List<Account> accounts = new ArrayList<Account>();

try {
    tx.begin();

    Query query = pm.newQuery("select from Customer " +
                              "where user == userParam " +
                              "parameters User userParam");
    List<Customer> customers = (List<Customer>)
    query.execute(user);

    query = pm.newQuery("select from Account " +
                        "where parent-pk == keyParam " +
                        "parameters Key keyParam");
    for (Customer customer : customers) {
        accounts.addAll((List<Account>)
        query.execute(customer.key));
    }

} finally {
    if (tx.isActive()) {
        tx.rollback();
    }
}

Более подробная информация доступна здесь: http://code.google.com/appengine/docs/java/datastore/transactions.html#Uses_For_Transactions

0 голосов
/ 03 ноября 2009

Если вы используете хранилище данных низкого уровня, это легко, так как «предок» - это концепция хранилища данных, а не концепция JDO / JPA AFAIK.

здесь - это ссылка на javadoc, показывающая конструктор Query, который принимает ключ предка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...