Google App Engine Objectify 5.1.21 - 多对多关系查询

时间:2017-11-30 08:11:48

标签: google-app-engine objectify

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

我有两个名为User and 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. 标识的用户的所有安装
  3. 加载有权访问由其ID(@id);
  4. 标识的安装的所有用户
  5. 加载由其登录名(@id)标识的用户的所有安装,并按其右侧过滤(例如,右= 2)。
  6. 提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

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

  1. 为该用户制作Key<User>
  2. 查找与该用户相关联的所有InstallUser
  3. 使用所有相关的Key<Installation>批量加载installatons。
  4. 使用Ref<?>中的Key<?>代替InstallUser并使用@Load注释自动提取Installation,您可以更聪明一点

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