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言語のパラメタの構文で記述します。入力パラメタが存在しない場合には省略できます。
Interstage EJB application deployment descriptor (sun-ejb-jar.xml)ファイルの定義詳細については、「4.2.3.3 Interstage EJB application deployment descriptor (sun-ejb-jar.xml)」を参照してください。
クエリのフィルタ式
クエリフィルタ式には、クエリパラメタ宣言で宣言した引数の名前、CMFのフィールド名、演算子、オペレーションの組み合わせで検索条件となるブール式を指定します。検索条件が真(true)となるレコードを検索します。SQLのWHERE句に相当しますが、Java構文に準拠した定義ができます。何も指定しない場合には、テーブルに存在するすべてのレコードを検索します。
演算子
クエリは、以下の演算子をサポートします。
種別 | 演算子 | 意味 |
---|---|---|
関係演算子 | == | 等しい |
!= | 等しくない | |
> | 大なり | |
< | 小なり | |
>= | 大なり、または等しい | |
<= | 小なり、または等しい | |
ブール演算子 | & | 論理積、AND |
&& | 論理積、AND | |
| | 論理和、OR | |
|| | 論理和、OR | |
~ | 2の補数表現 | |
! | 否定、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> |
定義例
例1
次のクエリは、Tarouという名前のすべての従業員を返します。次の文字列リテラルを使って、nameフィールドを比較するフィルタが定義されます。
name == "Tarou" |
Interstage EJB application deployment descriptor (sun-ejb-jar.xml)の<finder>タグは、次のように記述します。
<finder> <method-name>findEmployeeByName</method-name> <query-filter>name == "Tarou"</query-filter> </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>