1

JDOを使用してGoogleAppEngineJavaWebアプリを作成しています。

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回アクセスします...

4

2 に答える 2

1

考えられる解決策の1つは、2つのエンティティクラス間で双方向に所有される1対1の関係を確立することです。次に、次のことができます。

  1. トークンをクエリして、必要なものを取得SessionTokenします。
  2. 取得したの適切なgetterメソッドを呼び出して、SessionTokenの親を取得します。UserSessionToken

もう1つの可能な解決策は、「Google App Engine Java Persistence」ブログに記載されているように、「所有する関係全体で単純な結合を実行する」に従うことです。

于 2013-03-21T10:40:02.570 に答える
0
Query query = pm.newQuery(User.class);
query.setFilter("sessionToken == tokenParam && tokenParam == 'my_token'");
query.declareParameters(SessionToken.class.getName() + " tokenParam");

動作するはずです

于 2015-09-29T12:19:39.887 に答える