Java GAE数据存储区中的子查询

时间:2010-04-20 15:03:55

标签: java google-app-engine jdo jdoql

我正在尝试使用用户之间的连接(朋友列表)创建用户数据库。 主要有两个表:UserEntity(主要字段ID)和带有字段的FriendEntity:   - initiatorId - 发起友谊的用户的id   - friendId - 被邀请的用户的ID。

现在我正在尝试获取某个特定用户的所有朋友,并且在这里使用JDO中的子查询遇到了一些问题。

逻辑上查询应该是这样的: SQL:SELECT * FROM UserEntity WHERE EXISTS(SELECT * FORM FriendEntity WHERE(initiatorId == UserEntity.id&amp;&amp; friendId == userId)||(friendId == UserEntity.id&amp;&amp; initiatorId == userId))< / p>

或SELECT * FROM UserEntity WHERE userId IN(SELECT * FROM FriendEntity WHERE initiatorId == UserEntity.id)OR userId IN(SELECT * FROM FriendEntity WHERE friendId == UserEntity.id)

因此,要复制JDOQL中的最后一个查询,我尝试执行以下操作:

Query friendQuery = pm.newQuery(FriendEntity.class);
friendQuery.setFilter("initiatorId == uidParam");
friendQuery.setResult("friendId");

Query initiatorQuery = pm.newQuery(FriendEntity.class);
initiatorQuery.setFilter("friendId == uidParam");
initiatorQuery.setResult("initiatorId");


Query query = pm.newQuery(UserEntity.class);
query.setFilter("initiatorQuery.contains(id) || friendQuery.contains(id)");
query.addSubquery(initiatorQuery, "List initiatorQuery", null, "String uidParam");
query.addSubquery(friendQuery, "List friendQuery", null, "String uidParam");
query.declareParameters("String uidParam");

List<UserEntity> friends = (List<UserEntity>) query.execute(userId);

结果我收到以下错误: 解析表达式时不支持的方法。

有人可以帮忙解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

您正在尝试进行加入 - 您无法跨实体进行加入。

如果存在拥有的关系,这是一个简单连接的示例 http://gae-java-persistence.blogspot.com/2010/03/executing-simple-joins-across-owned.html

另外看一下这个网站,它有很多关于让持久性工作起作用的非常好的信息。以及连接的几个解决方法。

您可以在实体之间设置关系,为此参见GAE文档。