GAE w / Objectify – 你能查询HashMap吗?
在GAE中,当使用Objectify时,你能查询一个HashMap吗? 如果是这样你会怎么写呢?
ofy().load().type(MyClass.class).filter("hashMapfieldName", "keyQueryinggFor").list();
似乎在hashMapfieldName
是HashMap
地方hashMapfieldName
。 我期待找到hashMapfieldName
包含某个键的实体。
就像嵌入式类一样,Objectify将Map
转换为低级EmbeddedEntity
对象,该对象不可索引。 但是,如果你@Index你的Map
字段(或嵌入的类字段),Objectify将创建一个合成索引,让你无论如何查询。
按照您的示例,假设您有一个名为hashMapfieldName
的Map字段, hashMapfieldName
包含字符串"key"
到"value"
的映射。 此查询语法将返回具有该对的实体:
ofy().load().type(MyClass.class).filter("hashMapfieldName.key", "value");
如果您只是在寻找密钥存在,请尝试filter("hashMapfieldName.key !=", null)
。
我有一个类似的情况,我在嵌入式hashmap中存储了设备特定值,其中设备ID是密钥,我需要查询包含特定值的所有实体。
上面的stickfigure建议的解决方案可以在我的测试环境中工作。 但我意识到我不能将它用于真正的应用程序,因为它不会扩展到我们预测的用户数量。 这是因为Objectify将为我保存的每个hashmap键生成属性索引 。 就我而言,这意味着每个用户的设备都有自己的索引,可能是100000个索引!
所以相反,我采用了这种替代方法:
- 在实体上的
@OnSave
方法中,我将要搜索的值存储在单独的索引列表中,我只用于查询 - 然后我会像这样执行我的过滤查询:
ofy().load().type(MyEntity.class).filter("values", value)
我不确定Objectify
对HashMap
。
但是根据文档, HashMap
在Datastore
不是受支持的字段类型。 即使我们serialize
其serialize
并存储,它也将被存储为Blob,默认情况下unindexded
。
所以据我所知,无法查询HashMap
因为没有为它创建索引。