App引擎数据存储 - 在Enum字段上查询

时间:2010-02-28 03:26:01

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

我正在使用带有JDO的GAE(Java)来实现持久性。

我有一个带有Enum字段的实体,该字段标记为@Persistent并正确保存到数据存储区(从开发控制台的数据存储区查看器中观察到)。但是当我查询这些实体放置一个基于Enum值的过滤器时,它总是返回所有实体,无论我为枚举字段指定的值。

我知道GAE java支持枚举像基本数据类型一样持久化。但它是否也允许基于它们进行检索/查询?谷歌搜索无法指出任何这样的示例代码。

详情:

我在执行之前打印了Query。所以在两种情况下,查询看起来像 -

SELECT FROM com.xxx.yyy.User WHERE role == super ORDER BY key desc RANGE 0,50

SELECT FROM com.xxx.yyy.User WHERE role == admin ORDER BY key desc RANGE 0,50

上述两个查询都返回了数据存储区中的所有用户实体,尽管数据存储区查看器显示某些用户类型为“admin”,而某些用户类型为“超级”。

3 个答案:

答案 0 :(得分:3)

暂时,我用简单的整数常量替换了Enums。报告此案例是谷歌应用引擎中的一个问题:http://code.google.com/p/googleappengine/issues/detail?id=2927

答案 1 :(得分:3)

对于String或int以外的参数,我相信您需要使用declareParameters。尝试这样的事情:

Query q = pm.newQuery(com.xxx.yyy.User.class);
q.setFilter("role == p1");  //p1 is a variable place holder
q.declareParameters("Enum p1"); //here you define the data type for the variable, in this case an Enum
q.setRange(0, 50);
q.setOrdering("key desc");

AbstractQueryResult results = (AbstractQueryResult) pm.newQuery(q).execute(admin);

或者如果你想要更多像语法一样的gql -

Query query = pm.newQuery("SELECT FROM com.xxx.yyy.User WHERE role == p1 ORDER BY key desc RANGE 0,50");
query.declareParameters("Enum p1");
AbstractQueryResult results = (AbstractQueryResult) pm.newQuery(q).execute(admin);

答案 2 :(得分:2)

声明查询参数时,需要使用枚举的类名。

例如,如果使用方法样式构建查询,并假设您的枚举名为Role并且在User类下声明,则可以执行以下操作:

Query query = pm.newQuery(com.xxx.yyy.User.class);
query.setFilter("role == roleParam");
query.declareParameters(com.xxx.yyy.User.Role.class.getName() + " roleParam");