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

Java 在Google App Engine JDO中查询两个实体,java,google-app-engine,jdo,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; @Pe


我是谷歌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
}

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

正如@DataNucleus在其评论中所说,GAE数据存储不支持加入查询,因此我担心不可能在单个查询中检索到所有您想要检索的内容

据我所知,您有两种选择:

第一个选择是使用多个查询:一个查询要求所有公开帖子,然后是另一个查询,比如你写的获取用户所有提要的查询,另一个查询要求获得用户的所有好友,最后一个查询要求每个好友发帖子

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

@Persistent
private List<UserProfile> friendProfiles;
这样,正如GAE/J文档中所述,当您检索例如
UserFeed
时,只需使用以下命令即可轻松获取关联的
用户

retrievedUserFeed.getProfile();
您还可以通过以下方式访问已检索提要的作者的朋友:

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

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

@Persistent
private List<UserFeed> ownedFeeds;
@Persistent
私有列表拥有的提要;

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

您得到了什么错误,在哪里?我的查询仅适用于获取用户提要列表。我知道如何使用UserProfile.friendProfileKeys和UserFeed.userFeedType从UserFeed实体获取用户好友提要和公共提要。很抱歉,我不理解您想要检索的内容。。。您想要所有类型为public的UserFeed,以及与给定UserProfile相关的UserFeed,以及与作为给定UserProfile朋友的所有UserProfile相关的UserFeed?你想在一个查询中找到它吗?是的。。我想在一个单独的查询中找到它。正如GAE/J的文档所说,在与该数据存储连接的方式上,您不能做太多事情(显然JDOQL语言可以支持它……但如果不可能使用未定义的数据存储,那么这就没什么用了)。感谢您的回答,我决定用自己的关系更改我的设计模式。
retrievedUserFeed.getProfile().getFriendProfiles();
@Persistent
private List<UserFeed> ownedFeeds;