2009-06-01 7 views
4

One JDO Syntax leicht verwenden können, auf mehrere Parameter abgefragt werden, wie folgt:Wie dynamisch JDO Abfragen auf mehrere Parameter bauen

//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 einfach ist programmatisch eine Zeichenfolge mit dem Filter zu bauen:

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

und andere strign mit der Erklärung params:

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

Was nicht ist t sofort ist es, eine Strategie für die Ausführung der Abfrage in Abhängigkeit davon, welche Params sind im Filter (und wurden deklariert), so dass Sie am Ende mit einer Reihe von wirklich hässlich und Ad-hoc-Cascading If-else-Anweisungen mit allen mögliche Permutationen der Ausführung der Abfrage (alle params, nur die erste, nur die zweite, erste und zweite etc ...):

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

ich bin sicher, dass dies eine gemeinsame Aufgabe ist und jemand anderes tut es in ein allgemeiner und effizienter Weg.

Irgendwelche Vorschläge?

Antwort

5

fand ich eine Lösung in dem Verfahren query.executeWithArray

So kann ich Filter und param Erklärung die eigentlichen Objekte in ein Array von Objekt aufbauen kann eine Last dynamisch, die dann zu dem oben erwähnten Verfahren übergeben wird.

Eine andere wichtige Methode ist executeWithMap, die Sie verwenden können, um Parameter nach Name zu binden.

+1

Können Sie uns bitte die Codebeispiel zeigen, mit dem gleichen Problem durcheinander gebracht. –