EJB 照会の使用
Enterprise JavaBeans (EJB) 照会言語は、コンテナー管理のエンティティー Bean による照会を指定するために使用します。 この言語は Structured Query Language (SQL) に類似しています。EJB 照会は、パーシスタント・ストアへの Bean のマッピングには依存していません。
このタスクについて
EJB 照会は、以下の 3 通りの状況で使用できます。
- EJB エンティティー Bean のファインダー・メソッドを定義する場合。
- EJB エンティティー Bean の選択メソッドを定義する場合。
- executeQuery メソッド動的 API を使用して、動的に照会を指定する場合。
本製品の EJB 照会言語は、Sun EJB 2.1、EJB 3.0、および EJB 3.1 仕様で規定されている EJB QL に準拠しており、『EJB 仕様と WebSphere® 照会言語の比較』トピックにリストされている追加機能を備えています。
手順
例: EJB での照会
ここでは、Enterprise JavaBeans (EJB) スキーマの例と、照会の例のセットを紹介します。
EJB スキーマ | 照会例 |
---|---|
Entity Bean 名 (EJB 名) | DeptEJB (照会では使用されません) |
抽象スキーマ名 | DeptBean |
実装クラス | com.acme.hr.deptBean (照会では使用されません) |
パーシスタント属性 (cmp フィールド) |
|
関係 |
|
EJB スキーマ | 照会例 |
---|---|
Entity Bean 名 (EJB 名) | EmpEJB (照会では使用されません) |
抽象スキーマ名 | EmpBean |
実装クラス | com.acme.hr.empBean (照会では使用されません) |
パーシスタント属性 (cmp フィールド) |
|
関係 |
|
Address は、EmpBean で cmp フィールドとして使用されるシリアライズ可能オブジェクトです。
Address の定義は、次のとおりです。
public class com.acme.hr.Address extends Object implements Serializable {
public String street;
public String state;
public String city;
public Integer zip;
public double distance (String start_location) { ... } ;
public String format ( ) { ... } ;
}
下記の照会は、すべての部門を戻します。
SELECT OBJECT(d) FROM DeptBean d
下記の照会は、名前が「Web」で始まる部門を戻します。
下記は、結果を名前でソートします。
SELECT OBJECT(d) FROM DeptBean d WHERE d.name LIKE 'Web%' ORDER BY d.name
キーワード SELECT および FROM は例では大文字で表記されていますが、大/小文字の区別はありません。
照会で使用する名前が予約語である場合、その名前を照会で使用するためには二重引用符で囲む必要があります。
反転された語句のリストは、EJB 照会: 予約語 で検索できます。二重引用符で囲まれている ID は大/小文字の区別があります。
下記の例は、予約語である cmp フィールドの使用方法を示しています。
SELECT OBJECT(d) FROM DeptBean d WHERE d."select" > 5
下記の照会は、Bob が管理する従業員をすべて戻します。
下記の例は、パス式を使用して関係をナビゲートする方法を示しています。
SELECT OBJECT (e) FROM EmpBean e WHERE e.dept.mgr.name='Bob'
照会には、finder または select メソッドの対応する値を参照するパラメーターを含めることができます。
照会パラメーターには、次のように 1 から始まる番号が付けられています。
SELECT OBJECT (e) FROM EmpBean e WHERE e.dept.mgr.name= ?1
下記の照会は、多値の関係のナビゲーションを示しており、
1 人で 50000 以上 90000 以下の報酬を得ている従業員がいる部門をすべて戻します。
SELECT OBJECT(d) FROM DeptBean d, IN (d.emps) AS e
WHERE e.salary BETWEEN 50000 and 90000
この照会には、 各部門オブジェクトとそれに関連する従業員のコレクションとの間に結合操作が暗黙指定されています。 部門に従業員がいない場合は、その部門は結果に表示されません。 部門に 50000 より多くの報酬を得ている従業員が複数いる場合は、 その部門は、結果に複数回表示されます。
下記の照会は、重複する部門を除去します。
SELECT DISTINCT OBJECT(d) from DeptBean d, IN (d.emps) AS e WHERE e.salary > 50000
下記は、ボーナスが給料の 40% より多い従業員を検索します。
SELECT OBJECT(e) FROM EmpBean e where e.bonus > 0.40 * e.salary
下記は、部門内の従業員の給料とボーナスの合計が部門の予算を超える部門を検索します。
SELECT OBJECT(d) FROM DeptBean d where d.budget <
( SELECT SUM(e.salary+e.bonus) FROM IN(d.emps) AS e )
java.sql.* データ型 を CMP フィールドとして使用し、データ・ストアが DB2® の場合は、照会に DB2 スタイルの日時算術式を含めることができます。下記は、2000 年 1 月 1 日現在で最低 20 年就労した従業員をすべて検索します。
SELECT OBJECT(e) FROM EmpBean e where year( '2000-01-01' - e.hireDate ) >= 20
データ・ストアが DB2 でない場合、または java.util.Calendar を CMP フィールドとして使用したい場合は、照会で Java ミリ秒値を使用することができます。
下記の照会は、1990 年 1 月 1 日より前に生まれた従業員をすべて検索します。
SELECT OBJECT(e) FROM EmpBean e WHERE e.birthDate < 631180800232
下記は、従業員のいない部門を検出します。
SELECT OBJECT(d) from DeptBean d where d.emps IS EMPTY
下記は、Bob より報酬を得ている従業員をすべて検索します。
SELECT OBJECT(e) FROM EmpBean e, EmpBean b
WHERE b.name = 'Bob' AND e.salary + e.bonus > b.salary + b.bonus
下記は、最高額のボーナスを得た従業員を検索します。
SELECT OBJECT(e) from EmpBean e WHERE e.bonus =
(SELECT MAX(e1.bonus) from EmpBean e1)
前にリストした照会はすべて EJB オブジェクトを戻します。 finder メソッド照会は、必ず、ホームの EJB オブジェクトを戻さなければなりません。 select メソッド照会は、これに加えて、CMP フィールドか、 またはホームに属さないその他の EJB オブジェクトを戻すことができます。
下記は、EmpBean の有効な select メソッド照会です。
各部門のマネージャーを戻します。
SELECT d.mgr FROM DeptBean d
部門 42 のマネージャー名を戻します。
SELECT d.mgr.name FROM DeptBean d WHERE d.deptno = 42
部門 42 の従業員名を戻します。
SELECT e.name FROM EmpBean e WHERE e.dept.deptno=42
同じ照会を別の方法で作成するには、次のようにします。
SELECT e.name from DeptBean d, IN (d.emps) AS e WHERE d.deptno=42
finder および select 照会は、
SELECT 文節内では単一の CMP フィールドまたは EJBObject のみ許可します。
選択クエリーは Enterprise JavaBeans 2.1 で、SUM、MIN、MAX、AVG、および COUNT を使用して集計値を返すことができます。
SELECT max(e.salary) FROM EmpBean e WHERE e.dept.deptno=42
動的照会 API は、SELECT 文節内では複数の式を許可します。
下記の照会は、有効な動的照会ですが、有効な select または finder 照会ではありません。
SELECT e.name, e.salary+e.bonus as total_pay , object(e), e.dept.mgr
FROM EmpBean e
ORDER BY 2
下記の動的照会は、各部門の従業員数を戻します。
SELECT e.dept.deptno as department_number , count(*) as employee_count
FROM EmpBean e
GROUP BY by e.dept.deptno
ORDER BY 1
下記の動的照会 API は、
Bean または値オブジェクト・メソッドを含む照会を許可します。
SELECT object(e), e.address.format( )
FROM EmpBean e EmpBean e