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

时间:2011-02-25 19:14:58

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

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

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

现在,我希望能够通过JDO查询,基于Calendar对象键检索与Calendar相对应的事件。我在两个类中使用encodedKey。

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

我尝试以任何可能的方式执行此操作,无法弄清楚如何通过父键进行查询。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:4)

一些注意事项:

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

  1. 如果对此属性编制索引,则它们仅限于5000个元素。

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

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

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

    解决方案:

    1. 使用Slatkin视频的解决方案:将日历设为事件的父级(在数据存储区中)。然后添加父条件以进行查询:Query.setAncestor(Key calendarKey)

      更新:应使用实体父关系来创建“实体组”,例如交易范围的单位。

    2. 逆转这种情况:创建具有Calendar属性的Event实体,该属性指向事件所属的Calendar。然后,您只需查询具有'calendar == calendarKey`。

    3. 的事件