JDOQLによる検索

JDOにおいて条件検索をする際の記述をJDOQLと呼びます。これには

  • Single-String JDOQL
  • Declarative JDOQL

という書き方があります。

Single-String JDOQL(文字列による直接記述)

SQLを直接記述するような書き方です。以下のように書きます。個人的にはこの方法はおすすめできません。

Query query = pm.newQuery("SELECT FROM User WHERE age = 20");
List<User> result = (List<User>)query.execute();

Declarative JDOQL(宣言的記述)

メソッドで条件を指定していく方法です。実はこの方法も2つの方法があります

(直接指定する場合)

Query query = pm.newQuery(User.class);

List<User> result = (List<User>)query.setFilter("name=='Ochi' && age==20");

上記の方法は、引数で条件を直接文字列で書いてます。ここに変数を組み合わせるとややこしくなります。そこでこの方法よりも下記の記述をします。

(直接的に変数指定する場合)

Query query = pm.newQuery(User.class);

query.setFilter("name == NameParam && age == AgeParam");

query.declareParameters("String NameParam");

query.declareParameters("int AgeParam");

List<User> result = (List<User>) query.execute(username,age);

上記のプログラムはちょっと分かりにくいかもしれませが、ここでは、Filter設定のところでNameParamとAgeParamの2つ部分を変数として処理します。declareParametersを利用することで、それが変数部分であると明示的に宣言します。

最後のexecuteのところですが、NameParamとusername、AgeParamとageが対応していることになります。変数名が異なっているのになぜこのような対応付けになるかというと、単に出現順です。最初に出てきた変数部分(つまりNameParam)は最初の引数(つまりusername)に対応ということになります・

(暗黙的に変数指定する場合)

上記の方法で、変数の型宣言を省略する方法です。ここでのポイントは、条件を設定しえいる際に、変数部分に「:」(コロン)をつけていることです。この記述により、型宣言を省略できるようです。

Query query = pm.newQuery(User.class);

query.setFilter("name==:name && age==:age");

query.execute(name,age);