Java Хранилище данных Google App Engine: оператор «IN» доступен в фильтрах запросов JDO, как в Python?

На этой странице описан оператор IN, который можно использовать в хранилище данных GAE для сравнения поля со списком возможных совпадений, а не только с одним значением:

Однако это для Python. В Java (App Engine 1.2.5) попытка

query.setFilter("someField IN param");

на моем javax.jdo.query срабатывает JDOUserException «Не удалось проанализировать часть выражения: IN param».

Есть ли способ это сделать?


person Jim Blackler    schedule 19.09.2009    source источник
comment
Что является недопустимым JDOQL. Предлагаем вам прочитать спецификацию JDO или документы GAE/J для синтаксиса запроса... в частности, contains(), как показано ниже   -  person DataNucleus    schedule 13.05.2011


Ответы (2)


Python-версия IN на самом деле реализована в коде уровня приложения (который вы можете изучить, поскольку он является частью SDK App Engine с открытым исходным кодом): по сути, запрос с IN, подобным вашему, становится N запросами с == (где N == len(param)) и результаты этих N запросов объединяются в общий результат.

Хотя, возможно, удобно иметь эту функциональность как часть исходного кода, предоставленного Google, на самом деле нет никакой дополнительной ценности, кроме этого удобства, и, в частности, нет никакого преимущества в производительности по сравнению с тем, чтобы просто сделать это в вашем собственном коде. Так что я не удивлен, что эта небольшая поправка не была добавлена ​​(по крайней мере, пока) в версию для Java...

person Alex Martelli    schedule 19.09.2009

Чтобы использовать оператор IN, я использую это:

List<Site> query(List<String> searchTerms)
{
    javax.jdo.Query q = pm.newQuery(Site.class);
    q.setFilter("param.contains(siteField)");
    q.declareParameters("java.util.Collection param");
    return (List<Site>)q.execute(searchTerms);
}
person Carsten    schedule 13.05.2011