java - 在 GoogleEngine (Java) 上,在 JDO 中,如何根据父对象的 id 查询子对象列表?

标签 java google-app-engine parent-child jdo

我有两个持久值对象,Calendar 和 Event。 Calendar 有一个包含事件列表的属性,具有一对多关系。日历是事件的父级,如下所示。

@Persistent
@Element(dependent = "true")
private List<Event> events;

现在,我希望能够基于日历对象键通过 JDO 查询检索对应于日历的事件。我正在为这两个类使用 encodedKey。

我想在 Event 实体上运行查询,而不仅仅是检索整个 Calendar 对象,因为我希望能够仅检索一组事件,以便进行分页。

我试图以任何可能的方式做到这一点,无法弄清楚如何通过父键查询。

如有任何帮助,我们将不胜感激。

最佳答案

一些注意事项:

实体中的列表属性(如您的 List<Event> events )存储为序列化的 ProtocolBuffer。问题是:

  1. 如果此属性被编入索引,则它们被限制为 5000 个元素。

  2. 每次查询列表时,整个列表都需要反序列化。如果您可以有选择地检索列表元素,这就是问题的答案:您不能。

  3. 如果您在实体中有多个索引列表属性,那么这可能会导致 Exploding Indexes .

如果您想了解 GAE 数据存储的内部结构,那么这个视频是必须的:http://www.youtube.com/watch?v=AgaL6NGpkB8

解决方案:

  1. 使用 Slatkin 视频中的解决方案:使日历成为事件的父项(在数据存储方面)。然后添加父条件查询:Query.setAncestor(Key calendarKey) .

    更新实体父关系应该用于创建“实体组”,例如事务范围所在的单元。

  2. 反转情况:创建具有指向事件所属日历的日历属性的事件实体。然后您可以简单地查询具有“calendar == calendarKey”的事件。

关于java - 在 GoogleEngine (Java) 上,在 JDO 中,如何根据父对象的 id 查询子对象列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5121583/

相关文章:

java - 2个不同类的Java对象应该相等吗?

java - 使用 Platform SDK 的地点列表

google-app-engine - 文件不可访问 : 'templates/test.html' using jinja2 templates in certain directories

javascript - React Native - 从父组件重新渲染子组件

html - 动态高度父div和不听话的 child

java - 如何验证非必需的 RequestParam 不为空?

java - 不同的结果,为什么?

java - 在 Google App Engine (Java) 上发送内联电子邮件附件

entity-framework - 在 Objectify 中,如何在不知道父键的情况下通过 ID 加载实体?

javascript - 我该如何解决? DOM javascript 渐变不起作用?