我有两个持久值对象,Calendar 和 Event。 Calendar 有一个包含事件列表的属性,具有一对多关系。日历是事件的父级,如下所示。
@Persistent
@Element(dependent = "true")
private List<Event> events;
现在,我希望能够基于日历对象键通过 JDO 查询检索对应于日历的事件。我正在为这两个类使用 encodedKey。
我想在 Event 实体上运行查询,而不仅仅是检索整个 Calendar 对象,因为我希望能够仅检索一组事件,以便进行分页。
我试图以任何可能的方式做到这一点,无法弄清楚如何通过父键查询。
如有任何帮助,我们将不胜感激。
最佳答案
一些注意事项:
实体中的列表属性(如您的 List<Event> events
)存储为序列化的 ProtocolBuffer。问题是:
如果此属性被编入索引,则它们被限制为 5000 个元素。
每次查询列表时,整个列表都需要反序列化。如果您可以有选择地检索列表元素,这就是问题的答案:您不能。
如果您在实体中有多个索引列表属性,那么这可能会导致 Exploding Indexes .
如果您想了解 GAE 数据存储的内部结构,那么这个视频是必须的:http://www.youtube.com/watch?v=AgaL6NGpkB8
解决方案:
使用 Slatkin 视频中的解决方案:使日历成为事件的父项(在数据存储方面)。然后添加父条件查询:
Query.setAncestor(Key calendarKey)
.更新实体父关系应该用于创建“实体组”,例如事务范围所在的单元。
反转情况:创建具有指向事件所属日历的日历属性的事件实体。然后您可以简单地查询具有“calendar == calendarKey”的事件。
关于java - 在 GoogleEngine (Java) 上,在 JDO 中,如何根据父对象的 id 查询子对象列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5121583/