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

3
在GAE中,使用Objectify时,您可以查询HashMap吗?如果可以,您应该如何编写它?
ofy().load().type(MyClass.class).filter("hashMapfieldName", "keyQueryinggFor").list();

似乎无法在 hashMapfieldName 是一个 HashMap<String, String> 的情况下工作。我正在寻找包含特定键的 hashMapfieldName 实体。

3个回答

7
与嵌入式类一样,Objectify会将Map<String, String>转换为低级别的EmbeddedEntity对象,该对象不可索引。但是,如果您对Map字段(或嵌入式类字段)进行@Index操作,Objectify将创建一个合成索引,使您可以进行查询。
根据您的示例,假设您有一个名为hashMapfieldName的Map字段,其中包含字符串映射"key""value"。此查询语法将返回具有以下配对关系的实体:
ofy().load().type(MyClass.class).filter("hashMapfieldName.key", "value");

如果你只是想查找关键字是否存在,可以尝试filter("hashMapfieldName.key !=", null)


我有点困惑。在这个例子中,你是要创建自己的类,其中包含成员 String keyString value,还是仍然使用 java.util.HashMap - Marc M.
哦,我现在明白了。但是,如果我不知道键名怎么办?我正在寻找包含该键的实体在它们的HashMap fieldName中。可能不应该称其为“value”,哈哈抱歉。我让问题更清晰了。 - Marc M.
2
听起来你正在测试键是否存在。也就是说,有一个值且该值不为null(假设您不认为null是有效值)。我回答的最后一句话应该能帮助你理清思路。 - stickfigure
1
我刚刚有点困惑,因为 hashMapfieldName.key。我以为你字面意思上的“key”在查询中有特殊含义,但现在我明白你的意思是类似于 hashMapfieldName.keyQueryinggFor。非常感谢! - Marc M.
@stickfigure 我已经尝试过了,对我有效。但是,如果不事先知道Map“hashMapfieldName”中的字段,如何处理复合查询呢?我在以下链接发布了一个相关问题:https://stackoverflow.com/questions/45322198/google-datastore-with-objectify-composite-queries-on-hashmap - Archit Sinha

1
我有一个类似的情况,我在嵌入式哈希映射中存储了特定设备的值,其中设备ID是键,并且我需要查询包含某个值的所有实体。
上面的stickfigure提出的建议在我的测试环境中确实有效。但是我意识到我不能在真实应用程序中使用它,因为它无法扩展到我们预计的用户数量。这是因为Objectify将为我保存的每个哈希映射键生成一个属性索引。在我的情况下,这意味着每个用户的设备都将有自己的索引,可能是100000个索引!
因此,我选择了另一种方法:
- 在实体的@OnSave方法中,我将要搜索的值存储在单独的索引列表中,仅供查询使用。 - 然后,我将执行以下筛选查询:
ofy().load().type(MyEntity.class).filter("values", value)

0

我不确定 Objectify 对于 HashMap 做了什么。

但根据文档,HashMap 不是 Datastore 中支持的字段类型。即使我们将其 serialize 并存储,它也会被存储为默认为 unindexed 的 Blob。

所以据我所知,由于没有为其创建索引,HashMap 无法进行查询。


如果有人百分之百确定,请告诉我。否则看起来@Bharath是正确的。 - Marc M.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接