我有两个值持久的值对象Calendar和Event。 Calendar具有一个属性,该属性包含一系列事件,具有一对多关系。 Calendar是Events的父级,如下所示。
@Persistent
@Element(dependent = "true")
private List<Event> events;
现在,我希望能够通过JDO查询,基于Calendar对象键检索与Calendar相对应的事件。我在两个类中使用encodedKey。
我想在Event实体上运行查询,而不只是检索整个Calendar对象,因为我希望能够仅为分页目的检索一组事件。
我尝试以任何可能的方式执行此操作,无法弄清楚如何通过父键进行查询。
任何帮助都将不胜感激。
答案 0 :(得分:4)
一些注意事项:
实体中的列表属性(如List<Event> events
)存储为序列化的ProtocolBuffer。问题是:
如果对此属性编制索引,则它们仅限于5000个元素。
每次查询列表时,都需要对整个列表进行反序列化。如果您可以有选择地检索列表元素,那么这是您的问题的答案:您不能。
如果您在实体中有多个索引列表属性,则可能会导致Exploding Indexes。
如果您想了解GAE数据存储区的内部结构,那么这个vido是必须的:http://www.youtube.com/watch?v=AgaL6NGpkB8
解决方案:
使用Slatkin视频的解决方案:将日历设为事件的父级(在数据存储区中)。然后添加父条件以进行查询:Query.setAncestor(Key calendarKey)
。
更新:应使用实体父关系来创建“实体组”,例如交易范围的单位。
逆转这种情况:创建具有Calendar属性的Event实体,该属性指向事件所属的Calendar。然后,您只需查询具有'calendar == calendarKey`。