【发布时间】:2013-03-20 18:04:18
【问题描述】:
我正在使用 JDO 在 Google App Engine 中创建一个 Java 网络应用。
我有一个具有 SessionToken 属性的类 User。这两个类都是持久的,具有拥有的一对一关系。
@PersistenceCapable
public class User {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key key;
@Persistent
private SessionToken sessionToken;
//getters and setters...
}
@PersistenceCapable
public class SessionToken {
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key key;
@Persistent
private String token;
//getters and setters...
}
现在我想要一种方法,使用 SessionToken 的属性令牌从数据存储区获取用户。我的意思是,我需要这样的东西:
Query query = pm.newQuery(User.class);
query.setFilter("sessionToken.token == tokenParam");
query.declareParameters("String tokenParam");
//return retrieved user if any...
但这不起作用,因为查询无法访问子对象中的属性。
它抛出这个异常:
javax.jdo.JDOFatalUserException: SELECT FROM com.mockgaeapp.User
WHERE sessionToken.token == tokenParam PARAMETERS String tokenParam:
Can only reference properties of a sub-object if the sub-object is embedded.
我能做到的唯一方法是先获取 SessionToken,然后获取对应的用户,例如:
//First retrieve the SessionToken...
Query query = pm.newQuery(SessionToken.class);
query.setFilter("token == tokenParam");
query.declareParameters("String tokenParam");
List<SessionToken> tokens = (List<SessionToken>) query.execute(sessionToken);
if (!tokens.isEmpty()) {
//... then retrieve the User
query = pm.newQuery(User.class);
query.setFilter("sessionToken == sessionTokenParam");
query.declareParameters("String sessionTokenParam");
List<User> users = (List<User>) query.execute(tokens.get(0));
//return retireved user if any...
}
我想知道是否有其他方法可以做到这一点,只使用一个查询,或者即使有其他方法......而且我们必须考虑到这个操作会执行很多次......
编辑:我找到了一种更简单的方法,它也有效。在上一个示例中检索到 SessionToken 后,我使用它的密钥来检索用户,例如:
//... then retrieve the User
user = pm.getObjectById(User.class, tokens.get(0).getKey().getParent());
//return retireved user if any...
这样我进行了键查找而不是另一个查询,但无论如何我仍然访问数据存储两次...
【问题讨论】:
-
But this isn't working because the query can't access to the attributes in the child object.,除非您明确使用您所面临的问题,否则我们无法帮助您。什么样的消息表明无法访问子属性? -
你说得对,我已经添加了它抛出的异常
-
完整的堆栈会更有洞察力。但是因为这是我第一次看到这样的异常,我并不是说我已经看到了所有这些,但我猜这个限制是由
GAE而不是Datanucleus或JDO强制执行的。
标签: java google-app-engine google-cloud-datastore jdo