Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在GoogleEngine(Java)上,在JDO中,如何根据父对象的id查询子对象列表?_Java_Google App Engine_Parent Child_Jdo - Fatal编程技术网

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

在GoogleEngine(Java)上,在JDO中,如何根据父对象的id查询子对象列表?,java,google-app-engine,parent-child,jdo,Java,Google App Engine,Parent Child,Jdo,我有两个值对象,日历和事件,它们是持久的。Calendar的属性包含在事件列表中,具有一对多关系。日历是事件的父级,如下所示 @Persistent @Element(dependent = "true") private List<Event> events; @Persistent @元素(dependent=“true”) 私人列表活动; 现在,我希望能够通过JDO查询,根据Calendar对象键检索与日历对应的事件。我在两个类中都使用encodedKey 我希望在事件实体

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

@Persistent
@Element(dependent = "true")
private List<Event> events;
@Persistent
@元素(dependent=“true”)
私人列表活动;
现在,我希望能够通过JDO查询,根据Calendar对象键检索与日历对应的事件。我在两个类中都使用encodedKey

我希望在事件实体上运行查询,而不仅仅是检索整个日历对象,因为出于分页的目的,我希望仅检索一组事件

我试图以任何可能的方式执行此操作,但不知道如何通过父键进行查询

任何帮助都将不胜感激。

请注意:

实体中的列表属性(如
列表事件
)存储为序列化协议缓冲区。问题是:

  • 如果此属性已编制索引,则将其限制为5000个元素

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

  • 若您在实体中有多个索引列表属性,则这可能导致

  • 如果您想了解GAE数据存储的内部结构,则必须提供以下视频:

    解决方案:

  • 使用Slatkin视频中的解决方案:使日历成为事件的父项(在数据存储中)。然后将父条件添加到查询:
    query.set祖先(Key calendarKey)

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

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


  • Peter,您的解决方案是使用普通数据存储API查询,而不是JDO。我真的找到了方法。JDO支持对子对象的属性(如parentKey)进行注释。这是由JDO自动处理的,不需要编程。请参见以下内容:@Persistent@Extension(vendorName=“datanucleus”,key=“gae.parent pk”,value=“true”)私有字符串parentKey;关于5000上限,这究竟意味着什么?这是否意味着父类的一个实例最多只能有5000个事件的事件列表。谢谢?准确地说:每个实体都限制为5000个索引项。每个列表属性元素都会生成一个索引项(如果已编制索引的话)。我不喜欢JDO,因为它试图欺骗开发人员数据存储是SQL数据库。在我们的项目中,我们使用Objectify:@oviroa@Peter的建议仍然有效:与其让
    日历
    列出
    事件
    实体,不如让每个
    事件
    参考日历。请注意,这是相反的,不是除了。此外,没有理由将密钥存储为字符串-直接将其存储为密钥,数据存储支持它。