EJB 1.1規約には、CMP Entity Beanのfinderメソッドの検索条件の記述形式が規定されていません。このため、Interstage EJB application deployment descriptor (sun-ejb-jar.xml)ファイルの<cmp><one-one-finders><finder>タグにクエリの検索条件として以下の要素を指定します。
クエリによって返される各オブジェクトに適用される検索条件を指定します。SQLのWHERE句に対応します。テーブルに存在するすべてのレコードを検索する場合には省略できます。
クエリの1つまたは複数の入力パラメタの名前とタイプを指定します。Java言語のパラメタの構文で記述します。入力パラメタが存在しない場合には省略できます。
クエリによって返却される結果をソートします。SQLのORDER BY句に対応します。クエリによって返却される結果をソートしない場合には省略できます。
各要素のInterstage EJB application deployment descriptor (sun-ejb-jar.xml)ファイルの記述形式については、「3.2.3.3 Interstage EJB application deployment descriptor (sun-ejb-jar.xml)」を参照してください。
フィルタ式には、クエリパラメタ宣言で宣言した引数の名前、CMFのフィールド名、演算子、オペレーションの組み合わせで検索条件となるブール式を指定します。検索条件が真(true)となるレコードを検索します。SQLのWHERE句に相当しますが、Java構文に準拠した定義ができます。何も指定しない場合には、テーブルに存在するすべてのレコードを検索します。
演算子
クエリは、以下の演算子をサポートします。
種別 | 演算子 | 意味 |
---|---|---|
関係演算子 | == | 等しい |
!= | 等しくない(注) | |
> | 大なり | |
< | 小なり | |
>= | 大なり、または等しい | |
<= | 小なり、または等しい | |
ブール演算子 | & | 論理積、AND |
&& | 論理積、AND | |
| | 論理和、OR | |
|| | 論理和、OR | |
~ | 2の補数表現 | |
! | 否定、NOT | |
算術演算子 | + | 足し算 |
- | 引き算 | |
* | 掛け算 | |
/ | 割り算 |
(注)Symfowareでは!=演算子は未サポートです。
この場合、==演算子(等しい)の結果と!演算子(否定、NOT)を使用して同等の結果を得ることができます。
また、以下が有効です。
DateフィールドとDateパラメタの等価性と順序の比較が有効です。
StringフィールドとStringパラメタの等価性と順序の比較が有効です。
演算子の適用優先度を明示的に決定するカッコ
比較演算と算術演算での数値オペランドの昇格
昇格の規則は、Javaの規則と同様です(Java言語仕様の数値昇格を参照)。BigDecimal、BigInteger、および数値ラッパークラスによって拡張されます。
オペレーション
CMFまたはクエリパラメタが文字列の場合、以下のオペレーションをサポートします。それぞれのオペレーションをフィルタ式に指定した場合の例と、それぞれの指定例に対して実際にデータベースにアクセスする際のWHERE句の例を記載します。
オペレーション | フィルタ式の指定例 | 指定例に対するSQL変換後のWHERE句 |
---|---|---|
startsWith(String) | str.startsWith(“xyz”) | STR LIKE ('xyz%') |
endsWith(String) | str.endsWith(“xyz”) | STR LIKE ('%xyz') |
注意
半角空白は区切り文字として認識され、それ以外の用途として認識されません。
null値のフィールドは、サブ式がfalseを返した場合と同様に扱われ、NullPointerExceptionがスローされます。
パラメタ宣言は、1つのパラメタ宣言または複数の宣言をカンマで区切った文字列です。メソッドシグネチャは、Javaの構文に準拠します。例えば、findInRange(double low, double high)というクエリメソッドを定義した場合、クエリのパラメタには以下のように定義します。定義されたパラメタ名はクエリのフィルタ式で使用できます。
<query-params>double low, double high</query-params>
クエリ順序宣言はソートする値を持つCMF名とソートする順序(昇順または降順)を指定する以下のパラメタで定義します。
パラメタ | 意味 |
---|---|
ascending | クエリの結果を昇順でソートします |
descending | クエリの結果を降順でソートします |
CMP2.0、2.1ではEJB QLのORDER BY句で本機能と同等の運用が可能です。詳細はEJB規約を参照ください。
クエリ順序宣言はCMFとソートのパラメタを半角空白で区切って定義します。例えば、クエリの結果をsalaryというフィールドの値で降順にソートする場合は以下のように定義します。
<query-ordering>salary descending</query-ordering>
定義例
例1
次のクエリは、Tarouという名前のすべての従業員を返却し、その値を年俸"salary"フィールドの降順で返却します。
Interstage EJB application deployment descriptor (sun-ejb-jar.xml)の<finder>タグは、次のように記述します。
<finder> <method-name>findEmployeeByName</method-name> <query-filter>name == "Tarou"</query-filter> <query-ordering>salary descending</query-ordering> </finder>
例2
このクエリは、指定した価格帯に含まれるすべての製品を返します。価格の上限と下限を指定する2つのクエリパラメタdouble lowおよびdouble highが定義されます。フィルタは、クエリパラメタと次のpriceフィールドを比較します。
low < price && price < high
Interstage EJB application deployment descriptor (sun-ejb-jar.xml)の<finder>タグは、次のように記述します。
<finder> <method-name>findInRange</method-name> <query-params>double low, double high</query-params> <query-filter>low < price && price < high</query-filter> </finder>