JDOを使用してGoogleAppEngineでJavaWebアプリを作成しています。
SessionToken属性を持つUserクラスがあります。両方のクラスは、所有された1対1の関係で永続的です。
@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...
}
クエリを1つだけ使用する他の方法があるのか、それとも他の方法があるのか疑問に思いました...さらに、この操作は何度も実行されることを考慮に入れる必要があります...
編集:私はまた機能しているより簡単な方法を見つけました。最後の例のようにSessionTokenを取得したら、そのキーを使用して次のようにユーザーを取得します。
//... then retrieve the User
user = pm.getObjectById(User.class, tokens.get(0).getKey().getParent());
//return retireved user if any...
このようにして、別のクエリの代わりにキールックアップを実行しますが、とにかくデータストアに2回アクセスします...