• 検索結果がありません。

0 Bean についての EJB QL の要件

ドキュメント内 ejb.book (ページ 136-153)

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-distinctREAD_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)

ドキュメント内 ejb.book (ページ 136-153)