在GAE中,当使用Objectify时,你能查询一个HashMap吗?如果是这样你会怎么写呢?
ofy().load().type(MyClass.class).filter("hashMapfieldName", "keyQueryinggFor").list();
在hashMapfieldName
为HashMap<String, String>
的情况下似乎不起作用。我希望找到hashMapfieldName
包含某个键的实体。
答案 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)
我不确定Objectify
对HashMap
的作用。
但根据文档,HashMap
不是Datastore
中受支持的字段类型。即使我们serialize
它存储,它也会被存储为Blob,默认情况下为unindexded
。
据我所知,HashMap
无法查询,因为没有为它创建索引。