2009-06-01 5 views
4

On peut facilement utiliser la syntaxe JDO pour interroger sur plusieurs paramètres comme suit:Comment construire dynamiquement JDO requêtes sur plusieurs paramètres

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

Il est facile de construire par programmation une chaîne avec le filtre:

"customer == paramCustomer && date >= paramStartDate && date <=paramEndDate" 

et un autre strign avec la déclaration params:

"com.google.appengine.api.users.User paramCustomer, java.util.Date paramStartDate, java.util.Date paramEndDate" 

Ce qui est pas t immédiat est de trouver une stratégie pour l'exécution de la requête en fonction des paramètres qui sont dans le filtre (et ont été déclarés), de sorte que vous vous retrouvez avec un certain nombre d'instructions if-else cascade vraiment moche et ad hoc avec tous les permutations possibles de l'exécution de la requête (tous les params, seule la première, la deuxième, premier et deuxième etc ...):

MyClassList = (List<MyClass>) query.execute(user, startDate, endDate); 

Je suis sûr que cela est une tâche commune et quelqu'un d'autre le faire en un moyen plus général et efficace.

Une suggestion?

Répondre

5

je trouve une solution dans le procédé query.executeWithArray

De cette façon, je peux construire des filtres et la déclaration de param dynamiquement une charge les objets réels dans un tableau d'objet qui est ensuite transmis à la méthode mentionnée ci-dessus.

Une autre méthode importante est executeWithMap que vous pouvez utiliser pour lier des paramètres par leur nom.

+1

Pouvez-nous s'il vous plaît nous montrer l'exemple de code, foiré avec le même problème. –

Questions connexes