Come costruire dinamicamente JDO query su più parametri
-
06-09-2019 - |
Domanda
Si può facilmente utilizzare la sintassi JDO per interrogare su diversi parametri come segue:
//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);
E 'semplice per costruire una stringa di codice con il filtro:
"customer == paramCustomer && date >= paramStartDate && date <=paramEndDate"
e un altro strign con la dichiarazione params:
"com.google.appengine.api.users.User paramCustomer, java.util.Date paramStartDate, java.util.Date paramEndDate"
Quello che non è immediato è quello di elaborare una strategia per l'esecuzione della query a seconda di quale params sono nel filtro (e sono stati dichiarati), così si finisce con una serie di cascata veramente brutto e ad-hoc if-else affermazioni con tutte le possibili permutazioni di esecuzione di query (tutti i params, solo il primo, il secondo, primo e secondo, ecc ...):
MyClassList = (List<MyClass>) query.execute(user, startDate, endDate);
Sono sicuro che questo è un compito comune e qualcun altro sta facendo in un modo più generale ed efficiente.
Ogni suggerimento?
Soluzione
Ho trovato una soluzione nel metodo query.executeWithArray
In questo modo posso costruire filtri e dichiarazione param dinamicamente un carico fino gli oggetti reali in un array di oggetto che viene quindi passato al metodo di cui sopra.
Un altro metodo importante è executeWithMap
wich è possibile utilizzare per associare i parametri per nome.