Хранилище данных Java Google App Engine:Оператор 'IN' доступен в фильтрах запросов JDO, как в Python?
-
11-09-2019 - |
Вопрос
Эта страница описывает оператор 'IN', который может использоваться в GAE Datastore для сравнения поля со списком возможных совпадений, а не только с одним значением:
Однако это для Python.В Java (App Engine 1.2.5), пытаясь
query.setFilter("someField IN param");
в моем javax.jdo.query запускается исключение JDOUserException 'не удалось проанализировать часть выражения:В параметре".
Есть ли способ, которым это можно сделать?
Решение
Версия для Python IN
фактически реализован в коде уровня приложения (который вы можете изучить, поскольку он является частью SDK App Engine с открытым исходным кодом).:по сути, запрос с IN
например, ваш становится N запросами с ==
(где N == len(param)) и результаты этих N запросов объединяются обратно в качестве общего результата.
Хотя, возможно, удобно иметь эту функциональность как часть исходного кода, предоставленного Google, на самом деле нет никакой дополнительной ценности помимо этого удобства, и, в частности, нет никакого преимущества в производительности, если просто выполнять это в вашем собственном коде.Итак, я не удивлен, что это незначительное изменение не было (по крайней мере, пока) добавлено в версию Java...
Другие советы
Чтобы использовать оператор 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);
}