¿Cómo construir dinámicamente JDO consultas sobre múltiples parámetros
-
06-09-2019 - |
Pregunta
Se puede utilizar fácilmente la sintaxis JDO para consultar en varios parámetros de la siguiente manera:
//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);
Es sencillo de construir mediante programación una cadena con el filtro:
"customer == paramCustomer && date >= paramStartDate && date <=paramEndDate"
y otro strign con la declaración params:
"com.google.appengine.api.users.User paramCustomer, java.util.Date paramStartDate, java.util.Date paramEndDate"
Lo que no es inmediato es llegar a una estrategia para ejecutar la consulta en función de la params están en el filtro (y han sido declarados), por lo que terminan con un número de cascada realmente feo y ad-hoc if-else declaraciones con todas las permutaciones posibles de la ejecución de la consulta (todos los parametros, sólo el primero, el segundo, primero y segundo, etc ...):
MyClassList = (List<MyClass>) query.execute(user, startDate, endDate);
Estoy seguro de que esta es una tarea común y alguien más lo está haciendo de una manera más general y eficiente.
Cualquier sugerencia?
Solución
he encontrado una solución en el método query.executeWithArray
De esta manera puedo construir filtros y declaración PARAM dinámicamente una carga de hasta los objetos reales en una matriz de objeto que se pasa entonces con el método mencionado anteriormente.
Otro método importante es executeWithMap
los que se podrá utilizar para enlazar parámetros por nombre.