【问题标题】:App engine datastore - query on Enum fields应用引擎数据存储 - 查询枚举字段
【发布时间】:2011-01-21 22:33:19
【问题描述】:

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

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

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

详情:

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

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

尽管数据存储查看器显示某些用户属于“管理员”类型,而某些用户属于“超级”类型,但上述两个查询都会返回数据存储中的所有用户实体。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      对于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);
      

      【讨论】:

      • 你在发帖前试过这个吗?在用尽所有可能的方法之前,我不会向谷歌提交错误。
      • er,我知道这已经一岁了,但我刚刚遇到了这个问题,这个答案对我有用。
      【解决方案3】:

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

      例如,如果您使用方法样式构建查询,并假设您的枚举名为 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");
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多