【问题标题】:Query with Objectify, parent and children使用 Objectify、父母和孩子进行查询
【发布时间】:2014-04-28 13:43:21
【问题描述】:

我想知道我是否可以在同一个查询中查询一个班级的父亲和他的儿子。

@Entity
public class Blog {
    @Getter
    @Setter
    @Id
    String id;

    @Getter
    @Setter
    int popularity;
}

@Entity
public class Post {
    @Id
    @Getter
    @Setter
    String id;

    @Getter
    @Setter
    String title;

    @Getter
    @Setter
    long published;

    @Getter
    @Setter
    String locale;

    @Getter
    @Setter
    @Load
    private Ref<Blog> parent; // or @Parent?

}

这可能吗? ->

查询列表类型帖子>过滤区域设置“帖子”>订单发布“帖子”>订单流行度“博客”

谢谢。

【问题讨论】:

    标签: java google-app-engine google-cloud-datastore objectify


    【解决方案1】:

    不,你不能。这将是一个联接,并且应用引擎不支持查询中的联接。您要么需要将要过滤的数据复制到 Post 实体上,要么执行 2 个单独的查询并在内存中进行设置交集。

    【讨论】:

      【解决方案2】:

      如果您将 Post 中的 Ref 字段设置为 @Parent 字段,您可以在 Blog 上执行 ancestor() 查询并获取所有内容(ancestor() 包括父实体)。但是,除非您按类型(即 Post)进行过滤,否则您将获得该实体组中的所有内容。

      这种微优化几乎可以肯定是毫无意义的。它不会为您节省任何钱,也不太可能为您节省任何明显的延迟,尤其是如果您 @Cache the Blog。

      【讨论】:

        【解决方案3】:

        当然可以!通过将流行度字段添加到 Post 来做到这一点。如果博客的受欢迎程度发生变化,您必须每天或每周更新该值。

        这种信息的重复在noSql数据库中很典型,也很常见,别想了:总是想:“让所有数据准备好读取的方法(以最小的请求数)”,同步数据更新非常在 noSql dbs loke cassandra 或数据存储中很常见。尝试阅读有关该主题的一些文档

        @adevine 你不能说不!如果你不知道

        【讨论】:

        • 我特别声明,这样做的唯一方法是将要过滤的数据复制到 Post 对象上。这不是一个联接,它与问题所问的根本不同。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-25
        • 2017-06-26
        • 2017-03-06
        • 1970-01-01
        • 2021-10-17
        • 1970-01-01
        相关资源
        最近更新 更多