0


我是谷歌 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());

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

4

1 回答 1

1

正如@DataNucleus 在他的评论中所说,GAE Datastore 不支持连接查询,所以恐怕不可能在单个查询中检索您想要检索的所有内容......

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

第一种选择是使用多个查询:一个查询询问所有公开帖子,然后另一个查询(如您编写的用于获取用户的所有提要),另一个获取他的所有朋友,最后一个查询针对每个朋友,询问对于他们的帖子...

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

@Persistent
private List<UserProfile> friendProfiles;

@Persistent
private UserProfile profile;

这样,正如 GAE/J 文档中所说,当您检索例如 an 时UserFeed,您可以轻松地User使用以下方法获取关联:

retrievedUserFeed.getProfile();

您还可以通过以下方式访问检索到的提要作者的朋友:

retrievedUserFeed.getProfile().getFriendProfiles();

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

顺便说一句,如果你使用这种方法,我强烈建议你有一个关系 from UserProfiletoUserFeed例如:

@Persistent
private List<UserFeed> ownedFeeds;

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

于 2013-04-09T20:01:33.033 回答