*ユーザー*型のクエリでGoogleのデータストアの問題
-
06-09-2019 - |
質問
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するによってサポートされており、それが他のフィールド(文字列型と列挙型)で正常に動作します。他の奇妙なことは、アプリエンジンダッシュボードにデータビューアを見て「作者」フィールドは時に再びタイプのユーザーのとして格納されますが値が「user@gmail.com」であり、されていることです私は、単純なtoString()
(私は推測)で連載されますユーザー(利用者)のインスタンスを停止渡す文字列としてパラメータを宣言しています(つまり、上記の場合は、正常に動作します)のパラメータとして設定します。
誰でも任意のアイデア?
解決
クエリ言語で文字列置換を使用すると、の常にの悪い考えです。それはあなたの環境をユーザ打破すると混乱のためにあまりにも簡単だし、それは、エンコーディングの問題、などのコレクション全体を紹介します。
以前のパラメータ置換のアプローチで間違っていましたか?私の知る限り承知しているとして、それはすべてをサポートし、任意の構文解析の問題を回避し。限り渡す引数の数を知ることに問題が行くように、あなたは、引数の数は不明でクエリを実行するためにQuery.executeWithMapまたはQuery.executeWithArrayを使用することができます。