条件で絞って検索したりソートする際に制限があったので備忘メモ。
■制約
・PersistenceManagerのクエリ実行で使うexecute()に与えられる検索条件は3つまで
・ソート設定のsetOrdering()で使えるのは、setFilter()で使用した項目の中のみ。
setFilter()で未使用の項目はsetOrdering()で使えない
⇒JDOでのソートは諦めて、プログラム側でソートした
⇒プログラム側でソートする場合、「Comparator」を使うと簡単に実現できた
⇒下記の参考サイトを参照
----------------------------------------------------
例)
PersistenceManager pm = PMF.get().getPersistenceManager();
// クエリを生成
Query pmquery = pm.newQuery(TestClass.class);
// 検索条件を設定
pmquery.setFilter("userID == pUserID && date < pEnddate && date > pStartdate");
// 日付で降順にソート(setFilterで未使用のパラメータは使用できない)
pmquery.setOrdering("date DESC");
// 検索条件の型を宣言
pmquery.declareParameters("Long pUserID, java.util.Date pStartdate, java.util.Date pEnddate");
// 検索実行で渡せるパラメーターは3つまで
List
GsonBuilder gsonBuilder = new GsonBuilder();
// 日付フォーマットを指定
gsonBuilder.setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
Gson gson = gsonBuilder.create();
// 検索結果をJSON形式に変換
String jsonstr = gson.toJson(results);
… あとは、JSONを端末側に返す …
----------------------------------------------------
Slim3とか、他の実装方法だともっと良い解決方法があるのだろうか。。。
ネットで何でも調べられるって便利だなー。
■参考
JDOの制約 : http://www.atmarkit.co.jp/fjava/rensai4/bigtable03/02.html
Comparatorを使ったソート : http://education.yachinco.net/tips/java/03/2.html