複数のパラメータに対して JDO クエリを動的に構築する方法
-
06-09-2019 - |
質問
次のように、JDO 構文を使用して複数のパラメータをクエリすることが簡単にできます。
//specify the persistent entity you're querying and you filter usign params
query = pm.newQuery(MyClass.class, " customer == paramCustomer && date >= paramStartDate && date <=paramEndDate ");
// declare params used above
query.declareParameters("com.google.appengine.api.users.User paramCustomer, java.util.Date paramStartDate, java.util.Date paramEndDate");
//pass the object declared as params
MyClassList = (List<MyClass>) query.execute(user, startDate, endDate);
フィルターを使用してプログラムで文字列を構築するのは簡単です。
"customer == paramCustomer && date >= paramStartDate && date <=paramEndDate"
もう 1 つは params 宣言を含む文字列です。
"com.google.appengine.api.users.User paramCustomer, java.util.Date paramStartDate, java.util.Date paramEndDate"
すぐには実行できないのは、フィルター内にどのパラメータが含まれているか (宣言されているか) に応じてクエリを実行するための戦略を考え出すことです。そのため、非常に醜いアドホックなカスケード if-else ステートメントが多数作成されることになります。クエリ実行の可能な順序 (すべてのパラメータ、最初のパラメータのみ、2 番目のみ、最初と 2 番目など...):
MyClassList = (List<MyClass>) query.execute(user, startDate, endDate);
これは一般的なタスクであり、他の誰かがより一般的で効率的な方法でそれを行っていると思います。
なにか提案を?
解決
方法で解決策を見つけました query.executeWithArray
このようにして、フィルタとパラメータ宣言を動的に構築し、実際のオブジェクトをオブジェクトの配列にロードし、それが上記のメソッドに渡されるようにすることができます。
もう一つの重要な方法は、 executeWithMap
これを使用してパラメータを名前でバインドできます。
所属していません StackOverflow