えいのうにっき

むかしのじぶんのために書いています

JDOで複数の条件を持つクエリを発行する

わたくし、Google App Engineで初めてJDOを扱ったため、おそらく普通の方は引っかからないであろうところで引っかかってしまいました。今日はそれを、備忘録代わりに。



JDOで複数の条件を持つクエリを発行する方法

現在作っているプログラムで、「新規ユーザー登録に使えるIDかどうかを調べる」ことと「クライアントから入力されたID・パスワードでログインする」ことが必要になった。

前者については、以下のようなコードによって実現できるのは、Googleのリファレンスでもある通りかと思います。(本当に有無だけ調べるなら、SQLでいうcountっぽいことをした方が良いと思いますが。。)

String inputId = 【クライアントからの要求からID情報を取得】


PersistenceManager pm = PMF.get().getPersistenceManager();
Query query = pm.newQuery(Users.class);
query.setFilter("loginId == paramId");
query.declareParameters("String paramId");


List users = (List) query.execute(inputId);


if (users.isEmpty()) {
 //検索結果なし・ID使用可能
}else{
 //検索結果あり・ID使用不可能
}

これをSQLで表すと、以下のような感じですね。

SELECT * FROM Users WHERE loginId = inputId

で、後者なんですが、SQL的には以下のようなことがやりたいわけなんですが、

SELECT * FROM Users WHERE loginId = inputId AND password = inputPass

これをJDOでどう書けばいいかがわからなかった。笑
で、以下のものが色々試した結果うまくいった例。

String inputId = 【クライアントからの要求からID情報を取得】;
String inputPass = 【クライアントからの要求からPass情報を取得】;


PersistenceManager pm = PMF.get().getPersistenceManager();
Query query = pm.newQuery(Users.class);
query.setFilter("loginId == paramId && password == paramPass");
query.declareParameters("String paramId, String paramPass");


List users = (List) query.execute(inputId, inputPass);

条件やパラメータを文字列に記述して渡す、というのがなんともユニークに感じました。・・・ユニークだけに、今後もJDO周りでアレコレありそうだなぁ。
上記のような方法ではなく、SQLライクなクエリを発行する方法もある()みたいですが、どの方法を採用するのがJDO的にスタンダードなんだろう? さすがに色んな方法を混在して使うのはあまりやりたくないし・・・。JDOそのものを勉強する必要があるかも??

ついでにCDiT進捗状況。。

結局ログイン確認機能と送信情報選択機能を組み込むとこまでしかできなかった〜。来週の土日は遊ぶ予定、しっかり充電してきまうす。