Как динамически создавать запросы JDO по нескольким параметрам
-
06-09-2019 - |
Вопрос
Можно легко использовать синтаксис JDO для запроса нескольких параметров следующим образом:
//specify the persistent entity you're querying and you filter usign params
query = pm.newQuery(MyClass.class, " customer == paramCustomer && date >= paramStartDate && date <=paramEndDate ");
// declare params used above
query.declareParameters("com.google.appengine.api.users.User paramCustomer, java.util.Date paramStartDate, java.util.Date paramEndDate");
//pass the object declared as params
MyClassList = (List<MyClass>) query.execute(user, startDate, endDate);
Легко программно создать строку с фильтром:
"customer == paramCustomer && date >= paramStartDate && date <=paramEndDate"
и еще одна строка с объявлением параметров:
"com.google.appengine.api.users.User paramCustomer, java.util.Date paramStartDate, java.util.Date paramEndDate"
Что не является немедленным, так это разработать стратегию выполнения запроса в зависимости от того, какие параметры находятся в фильтре (и были объявлены), так что в итоге вы получаете ряд действительно уродливых и специальных каскадных операторов if-else со всеми возможными перестановками выполнения запроса (все параметры, только первый, только второй, первый и второй и т.д.):
MyClassList = (List<MyClass>) query.execute(user, startDate, endDate);
Я уверен, что это обычная задача, и кто-то другой делает это более общим и эффективным способом.
Есть какие-нибудь предложения?
Решение
Я нашел решение в этом методе query.executeWithArray
Таким образом, я могу динамически создавать фильтры и объявлять параметры и загружать фактические объекты в массив object, который затем передается методу, упомянутому выше.
Другим важным методом является executeWithMap
который вы можете использовать для привязки параметров по имени.