5 WebLogic Server のコ ンテナ管理 による永続性サービス
EJB 2. 0 Bean についての EJB QL の要件
デプ ロ イ メ ン ト 記述子では、 EJB QL ク エ リ 文字列を使用し て、 EJB 2.0 のエン テ ィ テ ィ Bean の各フ ァ イ ンダ ク エ リ を定義する必要があ り ます。 WebLogic
Query Language (WLQL) を EJB 2.0 エンテ ィ テ ィ Bean で使用する こ と はでき ま
せん。 WLQL は、 EJB 1.1 CMP で使用する こ と を想定し てい ます。
EJB 2.0 用 EJB QL の使い方
WLQL から EJB QL への移行
以前のバージ ョ ンの WebLogic Server を使用し た こ と があれば、 コンテナ管理に よ る エンテ ィ テ ィ EJB ではフ ァ イ ンダ メ ソ ッ ド 用に WLQL を使用で き ます。 こ の節では、 WLQL の一般的な処理についての ク イ ッ ク リ フ ァ レ ン ス を提供し ま す。 WLQL の構文 と EJB QL の構文の対応については、 次の表を参考に し て く だ
さ い。
WLQL のサンプル構文 対応する EJB QL の構文
(= operand1 operand2) WHERE operand1 = operand2 (< operand1 operand2) WHERE operand1 < operand2 (> operand1 operand2) WHERE operand1 > operand2 (<= operand1 operand2) WHERE operand1 <= operand2 (>= operand1 operand2) WHERE operand1 >= operand2
(! operand) WHERE NOT operand
(& expression1 expression2)
WHERE expression1 AND expression2
(| expression1 expression2)
WHERE expression1 OR expression2
(like text_string%) WHERE operand LIKE 'text_string%'
(isNull operand) WHERE operand IS NULL (isNotNull operand) WHERE operand IS NOT NULL
5 WebLogic Server のコ ン テナ管理によ る永続性サービ ス
5-14 WebLogic エ ン タ ープ ラ イズ JavaBeans プ ログラ マーズガ イ ド
EJB QL の EJB 2.0 WebLogic QL 拡張機能の使い 方
WebLogic Server には、 標準の EJB QL の拡張であ り 、 SQL に似た WebLogic QL と い う 言語が用意 さ れています。 こ の言語はフ ァ イ ンダ式 と 連携し、 RDBMS の
EJB オブジ ェ ク ト の ク エ リ 用に使用 さ れます。query は、weblogic-ql 要素を使
用し て、weblogic-cmp-rdbms-jar.xmlデプ ロ イ メ ン ト 記述子に定義し ます。
ejb-jarフ ァ イ ルには、weblogic-cmp-rdbms-jar.xmlフ ァ イ ルの weblogic-ql要素に対応する ク エ リ 要素が必要です。 ただ し、
weblogic-cmp-rdbms-jar.xmlの ク エ リ 要素は、ejb-jar.xmlの ク エ リ 要素を オーバ ラ イ ド し ます。
upper 関数と lower 関数
EJB WebLogic QL upperおよび lower拡張機能は、 大文字 と 小文字の違いがあ
る以外は検索式の文字 と 一致する結果を フ ァ イ ンダ メ ソ ッ ド が返せる よ う に、
引数の大文字 と 小文字を変換し ます。 大文字 と 小文字の変換は文字列を照合する ための一時的な も のなので、 データベース内に永続し ません。 基底のデータベー ス も、upperおよび lower関数をサポー ト し てい る必要があ り ます。
upper 関数は、 文字列の照合の前に、 引数内の文字をすべて大文字に変換し ま
す。 ク エ リ 内で大文字で表 さ れた式で upper関数を使用する と 、 大文字であ る か 小文字であ る かに関係な く 、 式に一致するすべての項目が返 さ れます。 た と え ば、 次の よ う に入力し ます。
select name from products where upper(name)='DETERGENT';
lower 関数は、 文字列の照合の前に、 引数内の文字をすべて小文字に変換し ま
す。 ク エ リ 内で小文字で表 さ れた式で lower関数を使用する と 、 大文字であ る か 小文字であ る かに関係な く 、 式に一致するすべての項目が返 さ れます。
select type from products where lower(name)='domestic';
注意: upperおよび lower拡張機能は、WebLogic Server 7.0 SP03 で追加さ れま し た。
EJB 2.0 用 EJB QL の使い方
SELECT DISTINCT の使用
EJB WebLogic QL 拡張機能の SELECT DISTINCT では、 重複し た ク エ リ を フ ィ ル タ処理する よ う データベースに指示し ます。 SELECT DISTINCT を EJB QL ク エ リ で指定する と 、 重複し た結果を ソ ー ト する ために EJB コンテナの リ ソ ース が使用さ れません。
EJB 2.0 CMP Bean の weblogic-ql要素の XML ス タ ンザで値を TRUEに設定し
て sql-select-distinct 要素を指定する と 、作成さ れ るデータベース ク エ リ の
SQL STATEMENT には DISTINCT 句が含まれます。
sql-select-distinct 要素は weblogic-cmp-rdbms-jar.xml フ ァ イルで指定 し ます。 ただ し、 Oracle データベースでア イ ソ レーシ ョ ン レベルを
READ_C0MMITED_FOR_UPDATE に指定し てあ る場合、sql-select-distinct を指 定する こ と はで き ません。 Oracle 上では、 ク エ リ に sql-select-distinctと READ_C0MMITED_FOR_UPDATEの両方を指定する こ と ができ ないか ら です。 こ の ア イ ソ レーシ ョ ン レベルを セ ッ シ ョ ン Bean な どで使用する可能性があ る場合、
sql-select-distinct要素を使用し ないで く だ さ い。
ORDERBY の使用
WebLogic ク エ リ 言語 (WL QL) の拡張機能であ る ORDERBY は、 フ ァ イ ンダ メ
ソ ッ ド と 連携し て、 選択におけ る CMP フ ィ ール ド の選択順序を指定する キー ワー ド です。
図5-1 id による順序付けを指定する WebLogic QL ORDERBY 拡張機能 ORDERBY
SELECT OBJECT(A) from A for Account.Bean ORDERBY A.id
注意: ORDERBY は、 すべての ソー ト 処理を DBMS に委ねます。 こ のため、 取
得さ れ る結果の順序は、 実行中の Bean の基盤 と な る特定の DBMS に よ っ て異な り ます。
ま た、 次の よ う に ORDERBY に昇順 [ASC] か降順 [DESC] か指定する こ と も で き ます。
5 WebLogic Server のコ ン テナ管理によ る永続性サービ ス
5-16 WebLogic エ ン タ ープ ラ イズ JavaBeans プ ログラ マーズガ イ ド
図5-2 id による順序付けを指定する WebLogic QL ORDERBY 拡張機能 (昇順 /降順指定)
ORDERBY <field> [ASC|DESC], <field> [ASC|DESC]
SELECT OBJECT(A) from A for Account.Bean, OBJECT(B) from B for Account.Bean
ORDERBY A.id ASC; B.salary DESC
サブ ク エ リの使用
WebLogic Server では、 EJB QL のサブ ク エ リ の次の よ う な機能をサポー ト し て
います。
サブ ク エ リ の戻 り 値の型
単一の cmp-field
集約関数
単純主キーを持つ Bean
比較オペラ ン ド と し てのサブ ク エ リ
相関サブ ク エ リ
非相関サブ ク エ リ
サブ ク エ リ での DISTINCT 句
WebLogic QL と サブ ク エ リ の関係は、 SQL ク エ リ と サブ ク エ リ の関係に似てい
ます。 WebLogic QL のサブ ク エ リ は、 外部 WebLogic QL ク エ リ の WHERE 句内 で使用し て く だ さ い。 若干の例外はあ り ますが、 サブ ク エ リ の構文は WebLogic QL ク エ リ の も の と ほぼ同じ です。
WebLogic QL を指定する手順については、5-14 ページの 「EJB QL の EJB 2.0
WebLogic QL 拡張機能の使い方」 を参照し て く だ さ い。 こ の手順に従っ て、
SELECT 文で次の例の よ う にサブ ク エ リ を指定し ます。
次の ク エ リ は、 成績順位を も と に平均以上の生徒を選択し ています。
SELECT OBJECT(s) FROM studentBean AS s WHERE s.grade > (SELECT AVG(s2.grade) FROM StudentBean AS s2)
EJB 2.0 用 EJB QL の使い方
上記 ク エ リ の例の中で、 サブ ク エ リ 、 「SELECT AVG(s2.grade) FROM
StudentBean AS s2」 が EJB QL ク エ リ と 同じ構文を備えている点に注意し て く だ さ い。
サブ ク エ リ をネス ト する こ と も で き ます。 こ の深 さ は、 基盤データベースのネ ス ト の許容範囲に よ っ て制限 さ れます。
WebLogic QL ク エ リ では、 メ イ ン ク エ リ と そのすべてのサブ ク エ リ の FROM 句
で宣言さ れ る識別子がユニーク でなければな り ません。 こ れはつま り 、 サブ ク エ リ の内側で前に ローカルに宣言し た識別子をそのサブ ク エ リ で再び宣言する こ と はでき ない と い う こ と です。
た と えば、 次の例は無効です。 Employee Bean が ク エ リ と サブ ク エ リ の双方で emp と し て宣言さ れています。
SELECT OBJECT(emp)
FROM EmployeeBean As emp
WHERE emp.salary=(SELECT MAX(emp.salary) FROM EmployeeBean AS emp WHERE employee.state=MA) こ の ク エ リ は次の よ う に記述すべきです。
SELECT OBJECT(emp)
FROM EmployeeBean As emp
WHERE emp.salary=(SELECT MAX(emp2.salary) FROM EmployeeBean AS emp2 WHERE emp2.state=MA) こ の例では、サブ ク エ リ の Employee Bean が メ イ ン ク エ リ の Employee Bean と 異 な る識別子にな る よ う に正し く 宣言さ れています。
サブ ク エ リ の戻り 値の型
WebLogic QL サブ ク エ リ の戻 り 値の型は、 次の よ う な各種の型のいずれかにな
り ます。
単一の cmp-field 型のサブ クエ リ
WebLogic Server は、cmp-fieldで構成 さ れてい る戻 り 値の型をサポー ト し てい
ます。 サブ ク エ リ か ら返さ れる結果は、 1 つの値ま たは値の集合か ら構成 さ れて いる可能性があ り ます。cmp-field型の値を返すサブ ク エ リ の例を次に示 し ま す。
SELECT emp.salary FROM EmployeeBean AS emp WHERE emp.dept = 'finance'
5 WebLogic Server のコ ン テナ管理によ る永続性サービ ス
5-18 WebLogic エ ン タ ープ ラ イズ JavaBeans プ ログラ マーズガ イ ド
こ のサブ ク エ リ は、 財務部門の従業員の給料すべて を選択し ています。
集約関数
WebLogic Server は、あ る cmp-field に対する集約か ら構成 さ れてい る戻 り 値型
をサポー ト し ています。 集約は必ず 1 つの値か ら構成 さ れる ので、 こ こ で返さ れ る値も常に 1 つの値にな り ます。cmp-fieldの集約 (MAX) の型の値を返すサブ ク エ リ の例を次に示し ます。
SELECT MAX(emp.salary) FROM EmployeeBean AS emp WHERE emp.state=MA こ のサブ ク エ リ は、 マサチ ューセ ッ ツで最高額の給料を 1 つだけ選択し てい ま す。
集約関数の詳細については、5-22 ページの 「集約関数の使用」 を参照し て く だ さ い。
単純主キーを持つ Bean
WebLogic Server は、 単純主キーを持つ 1 つのcmp-beanで構成 さ れてい る戻 り
値の型をサポー ト し ています。
注意: 複合主キーを持つ Bean はサポー ト されていません。 複合主キーを持つ Bean をサブ クエ リの戻り値の型と し て指定し よ う と し ても、 ク エ リ を
コ ンパイルする時点で失敗に終わり ます。
単純主キーを持つ Bean 型の値を返すサブ ク エ リ の例を次に示し ます。
SELECT OBJECT(emp) FROM EMployeeBean As emp WHERE emp.department.budget>1,000,000
こ のサブ ク エ リ は、 $1,000,000 以上の予算があ る部門の全従業員の リ ス ト を返し ます。
比較オペラ ン ド と し てのサブ ク エ リ
サブ ク エ リ を比較演算子のオペラ ン ド と し て使用し ます。 WebLogic QL では、 比 較演算子 ([NOT]IN、 [NOT]EXISTS) および算術演算子 (<、 >、 <=、 >=、 =、 お よび ANY や ALL と 使用する <>) のオペラ ン ド をサブ ク エ リ と し てサポー ト し ています。
EJB 2.0 用 EJB QL の使い方
[NOT] IN
[NOT] IN 比較演算子は、 左側のオペラ ン ド が右側のサブ ク エ リ オペ ラ ン ド の メ
ンバーかど う か検査し ます。
サブ ク エ リ が NOT IN オペレータ の右側のオペ ラ ン ド と な っ てい る例を次に示し ます。
SELECT OBJECT(item)
FROM ItemBean AS item
WHERE item.itemId NOT IN
(SELECT oItem2.item.itemID
FROM OrderBean AS orders2, IN(orders2.orderItems)oIttem2
サブ ク エ リ は、 すべての注文か ら 品目すべてを選択し ています。
メ イ ン ク エ リ の NOT IN 演算子では、 サブ ク エ リ に よ っ て返 さ れた集合の中に 含まれていない品目すべて を選択し ています。 し たがって、 最終的に、 メ イ ン ク エ リ が未注文の品目すべて を選択し ます。
[NOT] EXISTS
[NOT] EXISTS 比較演算子は、 サブ ク エ リ オペ ラ ン ド に よ っ て返 さ れた集合が空 かど う か検査し ます。
サブ ク エ リ が NOT EXISTS オペラ ン ド のオペラ ン ド と な っ てい る例を次に示し ます。
SELECT (cust) FROM CustomerBean AS cust WHERE NOT EXISTS
(SELECT order.cust_num FROM OrderBean AS order WHERE cust.num=order_num)
こ れは、 相関サブ ク エ リ を用いた ク エ リ の一例 と なっ ています。 詳細について は、 5-21 ページの 「相関サブ ク エ リ と 非相関サブ ク エ リ 」 を参照し て く だ さ い。
こ の ク エ リ は、 注文し ていない顧客をすべて返し ます。
SELECT (cust) FROM CustomerBean AS cust WHERE cust.num NOT IN
(SELECT order.cust_um FROM OrderBean AS order WHERE cust.num=order_num)