Как динамически создавать запросы JDO по нескольким параметрам

Можно легко использовать синтаксис 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"

и еще одна строка с объявлением params:

"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);

Я уверен, что это обычная задача, и кто-то другой делает это более общим и эффективным способом.

Любое предложение?


person JohnIdol    schedule 01.06.2009    source источник


Ответы (1)


Я нашел решение в методе query.executeWithArray

Таким образом, я могу динамически создавать фильтры и объявление параметров, загружая фактические объекты в массив объектов, которые затем передаются упомянутому выше методу.

Другой важный метод — executeWithMap, который можно использовать для привязки параметров по имени.

person JohnIdol    schedule 10.06.2009
comment
Можете, пожалуйста, показать нам пример кода, испорченный с той же проблемой. - person Sunil Rk; 14.10.2016