Objectify可选择加载引用的属性

时间:2016-07-25 15:20:44

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

我有一个UserAccount,其中包含以下列表。以下列表保存为自己的实体。我通常不需要以下列表,因此,我不使用@Load。但是,我有一种情况,我想加载多个UserAccounts及其以下内容。

所以,我需要这样的东西:

OfyService.ofy().load().type(UserAccount.class).limit(200).loadReference("followerRef").list();

UserAccount的示例:

@Entity
@Cache
public class UserAccount {
    @Id private String email;
    @Index
    private String nickname;
    private Ref<UserFollowing> followingRef;
}

1 个答案:

答案 0 :(得分:2)

我相信Objectify已经提供了一种以Load Groups的形式完成您所做的事情的方法。正如您正确指出的那样,使用@Load注释会自动检索UserAccounts followingRef,这是您不希望在大多数情况下发生的事情。

要使用UserAccount加载followingRef列表,您首先必须对您的实体应用以下简单修改:

@Entity
public class UserAccount {
    public static class Everything {}

    @Id Long id;
    @Load(Everything.class) Ref<UserFollowing> followingRef;
}

然后,您可以执行以下操作来加载单个UserAccount对象:

// Doesn't load followingRef
UserAccount ua = ofy().load().key(userAccountKey).now();

// Does load followingRef
UserAccount ua = ofy().load().group(Everything.class).key(userAccountKey).now();

与此类似,您可以使用UserAccount加载followinfRef个对象列表:

// In your case you'd do something like
List<UserAccount> accounts = ofy().load()
                                  .type(UserAccount.class)
                                  .group(Everything.class)
                                  .list();

这应该有希望解决你的问题。 我不知道该代码是否编译,但是如果它不是很难修复的话。

For further reading click here and scroll down to Load Groups section