Interstage Application Server J2EE ユーザーズガイド |
目次 索引 |
第3部 EJB編 | > 第9章 EJBサービスの機能 | > 9.2 Entity Beanの実行環境 |
EJB QLとは、finderメソッドまたはejbSelectメソッドなど検索メソッドのクエリ文を定義するためのSQL92ベースの言語です。
一般的に使用するSQLとの最大の違いは、SELECT型にEntity Beanの識別子だけが単独で指定されている場合に指定するOBJECTキーワードです。
EJB QLは抽象スキーマ名に基づいて記述されるので、特定のデータベースに依存しない互換性があります。抽象スキーマ名は、CMP/CMRフィールドに並んで抽象永続スキーマを構成する重要な構成要素です。
抽象スキーマ名は、ejb-jar内で一意になるようにしてください。
EJB QLを使用するには、deployment descriptor内の<query>タグにEJB QL文を記述します。
EJBアプリケーションのdeployment descriptorの情報が定義されているファイル(ejb-jar.xml)は、XML形式で記述する必要があります。このため、ejb-jar.xmlを編集する場合は、XML形式の仕様に従ってください。
特に以下の文字については、定義済み実体参照(暗黙定義エンティティ)で記述してください。
EJB QLが使用できるのは、CMP2.0のEntity Beanです。
編集する文字 |
定義済み実体参照 |
< |
< |
> |
> |
& |
& |
' |
' |
" |
" |
EJB QLでは、EJB規約に準拠した以下が使用できます。
EJB QL文とは、SELECT句、FROM句、WHERE句を使用して1つまたは複数のEJBオブジェクトを検索するクエリ文であり、SELECT句とFROM句の定義は必須です。このEJB QL文はコンテナによって解析され、適切なデータベースクエリ言語に翻訳されます。
返却値の値としてOBJECT(Entity Bean)、またはパス式を使ってCMF、CMRフィールドを指定します。
EJBアプリケーションのクラス名ではなく、Entity Bean内に記述された一意の“抽象スキーマ名”を指定します。
検索条件の指定を行います。例えば ?1は、検索メソッドのパラメタの1番目を意味します。
Entity Beanの検索メソッドにはfinderメソッド、またはejbSelectメソッドがあります。それぞれの検索メソッドにおいてメソッド名、パラメタの型を指定してください。
また、メソッドの返却値の型をマッピングするために、結果のタイプにLocalまたはRemote要素を指定します。デフォルト値はLocalです。
EJB QLおよびEJB QL拡張で使用できる機能は、以下です。
EJB QL構文 |
基本 |
拡張 |
説明 |
||
データ操作文 |
SELECT句 |
○ |
○ |
クエリに返却するオブジェクトまたは値を指定します。 |
|
FROM句 |
○ |
○ |
SELECT句およびWHERE句内で指定した値の取得場所を指定します。 |
||
WHERE句 |
○ |
○ |
クエリによって返却される値を制限するための条件を指定します。 |
||
ORDER BY句 |
× |
○ |
クエリによって返却される結果をソートします。 |
||
SELECT句の返却値 |
パス式(CMF/CMR) |
○ |
○ |
単一またはコレクションの値を持つ式です。 |
|
OBJECT(Entity Bean) |
○ |
○ |
SELECT句にEntity Beanの識別子だけが、単独で指定されている場合に指定します。 |
||
集合関数 |
MAX |
× |
○ |
集合で一番大きな値を返却します。 |
|
MIN |
× |
○ |
集合で一番小さな値を返却します。 |
||
SUM |
× |
○ |
集合の合計値を返却します。 |
||
AVG |
× |
○ |
集合の平均値を返却します。 |
||
COUNT |
× |
○ |
集合の要素数を返却します。 |
||
条件式 |
比較式 |
○ |
○ |
指定した2つの値を比較して評価します。 |
|
BETWEEN式 |
○ |
○ |
値が指定した範囲内に含まれるかを評価します。 |
||
LIKE式 |
○ |
○ |
LIKEに続く文字列が合致するかを評価します。 |
||
IN式 |
○ |
○ |
値が含まれているかどうかを評価します。 |
||
NULL比較式 |
○ |
○ |
値がNULL値かを評価します。 |
||
空コレクション比較式 (EMPTY比較式) |
○ |
○ |
コレクション値を持つパス式が要素をもつかを評価します。 |
||
コレクションメンバ式 (MEMBER式) |
○ |
○ |
値がコレクションのメンバであるかを評価します。 |
||
演算子 |
ナビゲーション演算子 |
. (ピリオド) |
○ |
○ |
関係を辿るシンボルです。 |
算術演算子 |
+ - (単項) |
○ |
○ |
+:指定した値は正の値です。 |
|
* / (乗算 除算) |
○ |
○ |
*:指定した値を乗算します。 |
||
+ - (加算 減算) |
○ |
○ |
+:指定した値を加算します。 |
||
比較演算子 |
= |
○ |
○ |
“=”の左辺の値と右辺の値が等しい場合に真となり、等しくない場合に偽となります。 |
|
<> |
○ |
○ |
“<>”の左辺の値と右辺の値が等しくない場合に真となり、等しい場合に偽となります。 |
||
< |
○ |
○ |
“<”の左辺の値が右辺の値より小さい場合に真となり、大きいまたは等しい場合に偽となります。 |
||
> |
○ |
○ |
“>”の左辺の値が右辺の値より大きい場合に真となり、小さいまたは等しい場合に偽となります。 |
||
<= |
○ |
○ |
“<=”の左辺の値が右辺の値より小さいまたは等しい場合に真となり、大きい場合に偽となります。 |
||
>= |
○ |
○ |
“>=”の左辺の値が右辺の値より大きいまたは等しい場合に真となり、小さい場合に偽となります。 |
||
論理演算子 |
NOT |
○ |
○ |
“NOT”に導かれる式が真の場合に偽となり、偽の場合には真となります。 |
|
AND |
○ |
○ |
“AND”の左辺および右辺が真の場合に真となり、そうでない場合には偽となります。 |
||
OR |
○ |
○ |
“OR”の左辺または右辺のいずれかが真の場合に真となり、左辺および右辺が偽の場合には偽となります。 |
||
関数式 |
文字列式 |
CONCAT |
○ |
○ |
引数で与えられた文字列を結合した値を求めます。 |
SUBSTRING |
○ |
○ |
指定した文字列の部分列を求めます。 |
||
LOCATE |
○ |
○ |
条件に指定した文字列の位置を求めます。 |
||
LENGTH |
○ |
○ |
文字数またはバイト数を求めます。 |
||
算術式 |
ABS |
○ |
○ |
引数に指定した値に対する“絶対値”を求ます。 |
|
SQRT |
○ |
○ |
検索条件に指定した値の平方根を求めます。 |
||
MOD |
× |
○ |
検索条件に指定した値の余剰を求めます。 |
○:指定可能
×:指定不可
EJB QL基本ではSELECT句、FROM句、WHERE句を使用したデータ操作ができます。また、データを編集して返却する演算子が使用できます。
より詳細なEJB QLの使用方法については、EJB2.0の規約を参照してください。
演算子を使用したEJB QL文の例です。
WHERE句がなく識別子が抽象スキーマ1つしか使われないもので、以下のEJB QLの例では、Customerという抽象スキーマから検索します。FROM句の後に抽象スキーマ名(Customer)を指定して、ASの後のcはCustomerをあらわす識別子です(AS は省略可)。
下記のようにSELECT型にEntity Beanの識別子だけが単独で指定されている場合は、OBJECT()演算子が必須です。
SELECT OBJECT(c) FROM Customer AS c
すべてのCustomerのCollectionを返します。
例2では、Customerという抽象スキーマよりCustomerすべての姓を検索するEJB QLを記述します。この例では、OBJECT()演算子は不要です。
SELECT句はCMPフィールドまたはCMRフィールドも返却できます。
SELECT c.lastName FROM Customer AS c
全Customerの姓の、Collectionを返します。
FROM句で検索された値に対しWHERE句を使用して、いろいろな条件テストが指定できます。
WHERE句で指定されたリテラル(定数)に一致するBeanを検索するためのEJB QLの記述です。指定したリテラルが文字列リテラルの場合は、シングルクォーテーション(‘)で囲みます。以下のEJB QLの例では名前がFujitsuであるCustomerを検索するEJB QLの記述です。
SELECT OBJECT(c) FROM Customer AS c
WHERE c.name = 'Fujitsu'
'Fujitsu'という名前のCustomerを返します。
【留意事項】
WHERE句の後に指定したパラメタに対して、疑問符(?) とパラメタが最初 (1) から数えて何番目になるかを指定します。以下のEJB QLの例では、Customerという抽象スキーマからパラメタの名前に指定されたCustomerから検索するEJB QLの記述です。
SELECT OBJECT(c) FROM Customer AS c
WHERE c.name = ?1
パラメタに指定された名前のCustomer Collectionを返します。
WHERE句では比較式が使用できます。以下の例では比較式(>=)を使用して年齢が25歳以上のCustomerを検索するEJB QLの例を記述します。
SELECT OBJECT(c) FROM Customer AS c
WHERE c.age >= 25
【留意事項】
BETWEEN式(NOT BETWEEN)の使用方法は、SQLと同様です。BETWEEN演算子の指定区間について検索できます。例ではIDが100〜200のCustomerを検索するEJB QLです。
SELECT OBJECT(c) FROM Customer AS c
WHERE c.id BETWEEN 100 and 200
idが100〜200のCustomerのCollectionを返します。
【留意事項】
NULL比較式演算子は、NULL値の検索に使用します。例えば年齢がNULL値ではないCustomerを検索するEJB QLは次のように記述します。
SELECT OBJECT(c) FROM Customer AS c
WHERE c.age IS NOT NULL
年齢情報があるCustomerのCollectionを返します。
EJB QL拡張は、EJB2.0で使用できる機能に加えて以下が拡張されています。
より詳細なEJB QL拡張の使用方法については、EJB2.1の規約を参照してください。
演算子を使用したEJB QL文の例です。
ORDER BY句を使用して値式にCMFを指定すると、検索結果がソートされます。ORDER BY句には昇順「ASC」か、降順「DESC」を指定できます。省略された場合、昇順になります。
以下の例では、返却される値をc.address.cityの降順で返却します。
SELECT c.address.city FROM Customer c
ORDER BY c.address.city DESC
【留意事項】
集合関数は、値の合計や平均などの集計を行う関数です。以下の例では、c.typeが‘IT’のものをc.employeeCountの値を合計して返却します。
SELECT SUM(c.employeeCount)
FROM Company c WHERE c.type = 'IT'
【留意事項】
MODを使用すると剰余を得ることができます。年齢を10で割った余りを返却します。
SELECT OBJECT(c) FROM Customer c
WHERE MOD(c.age, 10) = 0
【留意事項】
LIKE式の使用方法はSQLと同様です。以下の例では、名前がパターン('Fujitsu_'から始まる)文字列に合致するCustomerを検索するEJB QLの例を記述します。
SELECT OBJECT(c) FROM Customer AS c
WHERE c.name LIKE ?1 ESCAPE ?2
パターン文字列は'Fujitsu\_'を指定します。また、エスケープ文字は'\'を指定します。
【留意事項】
IN式の使用方法は、SQLと同様です。以下の例では年齢がパラメタで指定した値に合致するCustomerを検索するEJB QLの例を記述します。
SELECT OBJECT(c) FROM Customer AS c
WHERE c.age IN (?1, ?2, ?3)
【留意事項】
使用するDBMSがSymfowareの場合、以下に注意してください。
使用するDBMSがPostgreSQLの場合、以下に注意してください。
目次 索引 |