ローカル・インターフェースを使用して動的 Enterprise JavaBeans (EJB) 照会を実行する場合は、 QueryLocal インターフェースで executeQuery メソッドを呼び出します。 このインターフェースはメソッドのトランザクションを開始しません。 このため、照会を実行するにはトランザクション・コンテキストを明示的に確立する必要があります。
照会コードは以下のようなインポート・ステートメントで始めます。
import com.ibm.websphere.ejbquery.QueryLocalHome; import com.ibm.websphere.ejbquery.QueryLocal; import com.ibm.websphere.ejbquery.QueryLocalIterator; import com.ibm.websphere.ejbquery.IQueryTuple; import com.ibm.websphere.ejbquery.QueryException;
次に以下の例のように、照会ステートメントをストリングの形で書き込みます。例では低賃金従業員の名前と EJB 参照を検索しています。
String query = "select e.name, object(e) from EmpBean e where e.salary < 50000 ";
QueryLocalHome クラスから参照を取得して QueryLocal オブジェクトを作成します。 (このクラスは executeQuery メソッドを定義します。) 以下の例では ejb/query が動的照会の JNDI 名 (com/ibm/websphere/ejbquery/Query) を指すローカル EJB 参照として使用されていることに注意してください。
InitialContext ic = new InitialContext(); QueryLocalHome qh = ( LocalQueryHome) ic.lookup( "java:comp/env/ejb/query" ); QueryLocal qb = qh.create();
コードの最後の部分はトランザクションの開始、executeQuery メソッドの呼び出し、照会結果の表示を行います。 QueryLocalIterator クラスは照会結果セットを定義するため、インスタンス化されます。 (詳しくは、開発者用 API 文書 の『クラス QueryIterator』を参照してください。) トランザクションの最後にはイテレーターが有効期間を喪失するため、 executeQuery 呼び出しと同じトランザクションの有効範囲でイテレーターを使用しなければならないことに注意してください。
userTransaction.begin(); QueryLocalIterator it = qb.executeQuery(query, null, null); while (it.hasNext()) { IQueryTuple tuple = (IQueryTuple) it.next(); System.out.print( it.getFieldName(1) ); String s = (String) tuple.getObject(1); System.out.println( s); System.out.println( it.getFieldName(2) ); EmpLocal e = ( EmpLocal ) tuple.getObject(2); System.out.println( e.getPrimaryKey().toString()); } userTransaction.commit();
大抵の場合、QueryLocalIterator オブジェクトは demand-driven です。 つまり、データは増分的に戻されます。データベースからレコードを検索するごとに、イテレーターで next() メソッドが呼び出される必要があります。 (イテレーターが demand-driven でない場合もあります。 詳しくは、動的照会のパフォーマンスに関する考慮事項トピックの『ローカル QUERY インターフェース』サブセクションを参照してください。)
完全な照会結果セットはアプリケーション・サーバー・メモリーで増分的に具体化されるため、そのサイズは簡単に制御することができます。 例えば、テスト実行中に、ユーザーは照会結果のいくつかのタプルのみが戻される必要があると判断する場合もあります。 そのような場合には、QueryLocalIterator オブジェクトの close() メソッド呼び出しを使って照会ループをクローズします。 こうすることによって、イテレーターが使用する SQL リソースが解放されます。 そうしない場合、完全な結果セットがメモリーに累積されるか、トランザクションが終了するまで、これらのリソースは解放されません。