1

この質問で、次のようにGoogleデータストアにクエリを実行してユーザー(com.google.appengine.api.users.User)ごとに取得する問題を解決しました:

User user = userService.getCurrentUser();
String select_query = "select from " + Greeting.class.getName(); 
Query query = pm.newQuery(select_query); 
query.setFilter("author == paramAuthor"); 
query.declareParameters("java.lang.String paramAuthor"); 
greetings = (List<Greeting>) query.execute(user);

上記は問題なく動作しますが、少しいじった後、より複雑なクエリを作成する必要があるため、この構文はあまり実用的ではないことに気付きました.通常、フィルタは文字列変数として渡されますが、簡単にするためにインラインで作成されています):

User user = userService.getCurrentUser();    
String select_query = "select from " + Greeting.class.getName(); 
Query query = pm.newQuery(select_query); 
query.setFilter("author == '"+ user.getEmail() +"'");  
greetings = (List<Greeting>) query.execute();

field = 'value'この構文がJDOQLでサポートされていて、他のフィールド (文字列型と列挙型) で正常に機能する場合でも、明らかにこれは機能しません。もう1つの奇妙な点は、アプリエンジンダッシュボードのデータビューアーを見ると、「作成者」フィールドがタイプユーザーとして保存されていますが、値は「user@gmail.com」であり、パラメーターとして設定すると再び(上記の場合は正常に動作します)パラメーターを文字列として宣言してから、単純なシリアル化されたユーザー(ユーザー)のインスタンスを渡します(toString()推測します)。

誰でもアイデアはありますか?

4

1 に答える 1

1

クエリ言語で文字列置換を使用することは、常に悪い考えです。ユーザーが環境に侵入して混乱するのは非常に簡単であり、エンコーディングの問題などのコレクション全体が発生します。

以前のパラメータ置換アプローチの何が問題でしたか?私の知る限り、これはすべてをサポートし、解析の問題を回避します。渡す引数の数を知ることに関する問題に関しては、Query.executeWithMapまたはQuery.executeWithArrayを使用して、不明な数の引数でクエリを実行できます。

于 2009-06-02T03:37:33.550 に答える