【问题标题】:Query two entities in Google App Engine JDO在 Google App Engine JDO 中查询两个实体
【发布时间】:2013-04-08 11:43:18
【问题描述】:


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

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

【问题讨论】:

  • 你遇到了什么错误,在哪里?
  • 我的查询仅适用于获取用户提要列表。我确实知道如何使用 UserProfile.friendProfileKeys 和 UserFeed.userFeedType 从 UserFeed 实体获取用户朋友提要和公共提要。
  • 对不起,我最终没有理解您要检索的内容...您想要所有类型为 public 的 UserFeed,以及与给定 UserProfile 相关的那些,以及与所有相关的那些作为给定 UserProfile 朋友的 UserProfile?你想在一个查询中得到它吗?
  • 是的.. 我希望它在一个查询中
  • 正如 GAE/J 的文档所说,您不能在连接该数据存储的方式上做太多事情(显然 JDOQL 语言可以支持它......但如果不能使用 unlderying 数据存储那么这并不重要)。

标签: java google-app-engine jdo


【解决方案1】:

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

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

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

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

@Persistent
private List<UserProfile> friendProfiles;

@Persistent
private UserProfile profile;

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

retrievedUserFeed.getProfile();

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

retrievedUserFeed.getProfile().getFriendProfiles();

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

顺便说一句,如果你使用这种方法,我强烈建议你有一个从UserProfileUserFeed的关系比如:

@Persistent
private List<UserFeed> ownedFeeds;

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

【讨论】:

  • 谢谢你的回答,我决定用自有关系改变我的设计模式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-25
  • 1970-01-01
  • 2011-10-22
相关资源
最近更新 更多