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/

相关文章:

python - 如何使用 App Engine Python 处理 HTML 数组?

java - 使用Tomcat时如何避免在Eclipse/NetBeans中编写Java代码?

java - 使用 grpc 服务器拦截器进行嵌套服务器调用

java - com.google.appengine :appengine-api-1. 0-sdk:jar 的“dependency.dependency.version”必须是有效版本,但为 '${appengine.target.version}'

python - 导入错误 : Failed to import the Cloud Firestore library for Python

linux - Linux进程了解父级<>子级

c# - 我如何开始用 java 或 c# 为学校项目创建一个小型编译器

google-app-engine - 通过代理使用 Google App Engine 的位置服务

javascript - 使用父级 React 元素的 this.props 重复子级

python - 如何确保子进程不会在父进程终止时终止?