GAE w / Objectify - 你能查询HashMap吗?

时间:2014-08-21 23:09:40

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

在GAE中,当使用Objectify时,你能查询一个HashMap吗?如果是这样你会怎么写呢?

ofy().load().type(MyClass.class).filter("hashMapfieldName", "keyQueryinggFor").list();

hashMapfieldNameHashMap<String, String>的情况下似乎不起作用。我希望找到hashMapfieldName包含某个键的实体。

3 个答案:

答案 0 :(得分:7)

就像嵌入式类一样,Objectify将Map<String, String>转换为低级EmbeddedEntity对象,该对象不可索引。但是,如果你@Index你的Map字段(或嵌入的类字段),Objectify将创建一个合成索引,让你无论如何都可以查询。

按照您的示例,我们假设您有一个名为hashMapfieldName的地图字段,其中包含字符串"key""value"的映射。此查询语法将返回具有以下对的实体:

ofy().load().type(MyClass.class).filter("hashMapfieldName.key", "value");

如果您只是寻找密钥存在,请尝试filter("hashMapfieldName.key !=", null)

答案 1 :(得分:1)

我有一个类似的情况,我在嵌入式散列图中存储了设备特定值,其中设备ID是密钥,我需要查询包含特定值的所有实体。

上面的stickfigure建议的解决方案在我的测试环境中有效。但我意识到我不能将它用于真正的应用程序,因为它不会扩展到我们预测的用户数量。这是因为 Objectify将为我保存的每个hashmap键生成属性索引。就我而言,这意味着每个用户的设备都有自己的索引,可能是100000个索引!

相反,我采用了这种替代方法:

  • 在实体的@OnSave方法中,我将要搜索的值存储在单独的索引列表中,我只用于查询
  • 然后我会像这样做我的过滤查询: ofy().load().type(MyEntity.class).filter("values", value)

答案 2 :(得分:0)

我不确定ObjectifyHashMap的作用。

但根据文档,HashMap不是Datastore中受支持的字段类型。即使我们serialize它存储,它也会被存储为Blob,默认情况下为unindexded

据我所知,HashMap无法查询,因为没有为它创建索引。