在Google App Engine JDO中查询两个实体

时间:2013-04-08 11:43:19

标签: java google-app-engine jdo


谷歌appengine和jdo新手。我不知道如何用两个实体在JDO中编写查询。我有UserProfile和UserFeed实体,如下所示。

@PersistenceCapable
public class UserProfile {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key key;

@Persistent
private String firstName;

@Persistent
private String lastName;

@Persistent
private List<Key> friendProfileKeys;
}

@PersistenceCapable
public class UserFeed {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key key;

@Persistent
private Key profileKey;

@Persistent
private String comment;   

@Persistent
private UserFeedType userFeedType;//Friends,Public
}

以下查询我曾经获得用户发布的供稿列表。

final Query query = pm.newQuery(UserFeed.class);
final List v;

query.setFilter("profileKey == paramUserProfileKey");
query.declareParameters("com.google.appengine.api.datastore.Key paramUserProfileKey");

v = (List) query.execute(profile.getKey());

请帮助我获取用户及其朋友发布的供稿列表以及公开帖子。

1 个答案:

答案 0 :(得分:1)

正如@DataNucleus在他的评论中所说,GAE数据存储区不支持连接查询,所以我担心在一个查询中检索你想要检索的所有内容都是不可能的......

据我了解,您有两个选择:

第一选择是使用多个查询:一个查询询问所有公开帖子,然后是其他查询,例如您编写的查询以获取用户的所有Feed,其他查询以获取所有朋友和最后一个查询每个朋友,要求他们的帖子......

第二选择是使用owned relationships。这样,您必须更改Key类型的字段(“外键”,而不是主键!)并使用实际类的字段。例如,您应该有一个这样的字段:

@Persistent
private List<UserProfile> friendProfiles;

@Persistent
private UserProfile profile;

这样,正如GAE / J文档中所述,当您检索UserFeed时,只需使用以下内容即可轻松获取关联的User

retrievedUserFeed.getProfile();

您还可以通过以下方式访问已检索Feed的作者的朋友:

retrievedUserFeed.getProfile().getFriendProfiles();

这些拥有的关系有一个我无法详细解释你的行为(参见上一个链接),但基本上当你检索一个与其他实体拥有关系的实体时,如果你没有触摸对应字段,永远不会检索相关实体。在前面的示例中,如果您检索UserFeed但从未使用方法getProfile(),则永远不会在内存中加载UserProfile,从而节省资源......

顺便说一句,如果您使用此方法,我强烈建议您建立从UserProfileUserFeed的关系,例如:

@Persistent
private List<UserFeed> ownedFeeds;

因为您希望从UserProfile导航到UserFeed,而不仅仅是相反的方式......(注意:这是一个独立于GAE和JDO以及任何实现的设计问题)