java - 查询 Google App Engine JDO 中的两个实体

标签 java google-app-engine jdo


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

请帮助我获取用户及其 friend 发布的提要列表以及公共(public)帖子。

最佳答案

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

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

第一个选择是使用多个查询:一个查询要求所有公开帖子,然后其他查询(例如您为获取用户的所有提要而编写的查询),另一个查询则获取他的所有信息 friend ,最后对每个 friend 进行一个查询,询问他们的帖子...

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

@Persistent
private List<UserProfile> friendProfiles;

@Persistent
private UserProfile profile;

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

retrievedUserFeed.getProfile();

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

retrievedUserFeed.getProfile().getFriendProfiles();

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

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

@Persistent
private List<UserFeed> ownedFeeds;

因为您需要从 UserProfile 导航到 UserFeed 而不仅仅是相反的方式...(注意:这是一个独立于 GAE 和 JDO 的设计问题,并且无论实现如何)

关于java - 查询 Google App Engine JDO 中的两个实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15878183/

相关文章:

java - TestNG XML 文件无法调用/创建 XSSFWorkbook

java - 在 Java 中加入字符串集合的首选习惯用法

java - 插入数据时JDBC连接错误

java - Google App Engine 数据存储事务的两种不同方法——使用哪一种?

java - 为什么 JDO 认为这个分离对象是干净的?

java - 停止 android 中的自定义处理程序

google-app-engine - 将 AppEngine/Go Users API 与 OAuth : code sample, 工作流一起使用,有什么帮助吗?

google-app-engine - Google App Engine Cron 时间表和时长

node.js - 云存储连接域与API服务器

java - JDO中无法删除照片