【问题标题】:Google App Engine Objectify 5.1.21 - Many-to-many relationship queriesGoogle App Engine Objectify 5.1.21 - 多对多关系查询
【发布时间】:2017-11-30 08:11:47
【问题描述】:

我是 Objectify 编码的新手,我需要您的帮助来解决多对多关系查询的问题。

我有 2 个名为 User 和 Installation 的实体:

@Entity
public class User {
    @Id private String login;
    private String password;
    @Index private String name;
    @Index private String firstName;
    @Index private byte right;
}

@Entity
public class Installation {
    @Id private long id;
    @Index private long clientId;
    @Index private String name;
    private String address1;
    private String address2;
    @Index private String postCode;
    private String city;
    @Index private String countryCode;
    @Index private int status;
}

一个用户可以访问多个安装,一个安装可以有多个用户:多对多关系。我想映射这些实体,但我不想在加载用户时系统地加载安装。因此,我创建了一个用于映射用户和安装的实体:

@Entity
public class InstallUser {
    @Id private Long id;
    @Index Key<User> userKey;
    @Index Key<Installation> instalKey;

    public void setLink(User user, Installation instal){
        //initialize
        this.userKey = Key.create(User.class, user.getLogin());
        this.instalKey = Key.create(Installation.class, instal.getId());
    }
}

你能帮我把查询写到:

  1. 加载由其登录名 (@id) 标识的用户的所有安装;
  2. 加载所有有权访问由其 ID (@id) 标识的安装的用户;
  3. 加载由登录名 (@id) 标识并按权限过滤的用户的所有安装(例如,right=2)。

提前感谢您的帮助。

【问题讨论】:

    标签: google-app-engine objectify


    【解决方案1】:

    虽然数据存储不会为您执行连接,但您仍然可以执行连接 - 您是查询计划者。所以做RDBMS会做的事情。例如,要执行 #1(“加载由其登录名标识的用户的所有安装”),您将:

    1. 为该用户创建Key&lt;User&gt;
    2. 查找与该用户关联的所有InstallUsers
    3. 使用所有相关的Key&lt;Installation&gt;s 批量加载安装。

    InstallUser 中使用Ref&lt;?&gt;s 代替Key&lt;?&gt;s 并使用@Load 注释自动获取Installation 可以更聪明一些。

    还有很多其他方式来构建这些数据。根据关系的数量,您可以在UserInstallation 中使用列表属性,而不是单独的关系实体。但你走在正确的道路上。

    【讨论】:

    • 感谢您的回答。如果我理解正确,对于查询 #1 和 #2,我需要在 Objectify 中运行 2 个查询以加载列表:加载 Keys>,然后从 Keys> 加载列表。是否可以只写 1 个查询?查询 #3 有什么解决方案吗?你说 Ref> 会更聪明。你能开发吗?
    • 您不能将其作为单个查询执行,因为数据存储不会为您执行联接。您必须模仿数据库查询计划器的行为。对于#3,您可能会发现最容易对数据进行非规范化 - 即,将安装 (right) 中的一些数据拉入 InstallUser,以便您可以通过它进行过滤。数据存储涉及一些权衡。您不会获得 SQL 或联接或聚合,但您会获得一个零维护、无限可扩展的数据库。这种权衡是否值得因应用而异。
    • @stickfigure @Load 注释是否也适用于 Key&lt;T&gt; 字段?
    • 不,目前没有。不过,这不是一个坏主意。我正在对 v6 进行大规模重写,但也许这对 6.1 来说是个好主意。
    猜你喜欢
    • 2012-02-27
    • 1970-01-01
    • 2011-03-17
    • 2016-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    • 1970-01-01
    相关资源
    最近更新 更多