如何在多个参数上动态构建JDO查询

时间:2009-06-01 17:07:13

标签: java google-app-engine jdo google-cloud-datastore

可以使用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);

我确信这是一项常见任务,而其他人则以更为通用和有效的方式进行。

有什么建议吗?

1 个答案:

答案 0 :(得分:5)

我在方法query.executeWithArray

中找到了一个解决方案

这样我就可以动态地构建过滤器和param声明,将实际对象加载到一个对象数组中,然后传递给上面提到的方法。

另一个重要的方法是executeWithMap,您可以使用它来按名称绑定参数。