【问题标题】:Objectify - all children of a given Parent对象化 - 给定父级的所有子级
【发布时间】:2015-12-09 14:17:12
【问题描述】:

我正在使用 objectify 和谷歌云数据存储。

我正在寻找一种方法让所有孩子(没有特定类型或种类)成为父母。

我知道祖先函数。

我用过这个

ofy().load().ancestor(entity).list();

这给所有的子孙(我不要)。

在此示例中,A 是 1、2 和 3 的父级。 1 是 m 的父级

一种 / | \ 1 2 3 | 米

我想要 {1 ,2 ,3} 的数据而不是 {1 ,2 ,3, m }

您知道获得更准确结果的方法吗? (没有孙子)

【问题讨论】:

    标签: java objectify google-cloud-datastore


    【解决方案1】:

    对此没有优雅的解决方案,我怀疑你在滥用@Parent。想要在数据存储中创建 grand@Parent 关系应该是非常、非常的。数据存储中的大多数层次关系最好用传统的外键关系表示。

    但如果你下定决心,一个解决方案是让 1、2 和 3 都是同一种常见类型的多态对象。那么你可以这样查询:

    ofy().load().type(BaseType.class).ancestor(parent)
    

    使用类型进行查询的另一个优点是您现在可以应用过滤器(kindless 查询不能有过滤器):

    ofy().load().type(BaseType.class).ancestor(parent).filter("arbitraryField", value)
    

    如果您希望排除的值很少,另一种选择是无论如何都获取它们并将它们过滤掉。

    【讨论】:

      【解决方案2】:

      我认为唯一的方法是创建一个 index 并在父属性上使用 filter。 @parent 会将父键添加为子键的一部分,因此从本质上讲,您将获得所有下降,并且除了过滤类型之外没有简单的方法。

      【讨论】:

      • 好的。如果我不知道父字段的名称。如何应用过滤器?我的意思是所有孩子都有一个父母财产,但他们没有相同的名字。用同样的例子。如果在实体 1 中,父级称为“父级”,但在实体 2 中称为“parentA”
      • 你是对的,所以我没有简单的解决方案。对我来说唯一的方法是通过祖先查询并通过反射检查属性是否等于父父对象以删除孙子
      • 你不能@Index@Parent字段。 @Parent 字段不是真正的属性,它们是键的一部分。
      猜你喜欢
      • 2018-09-17
      • 2020-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多