例: 動的照会のためのリモート・インターフェースの使用
リモート・インターフェースを使用して動的 Enterprise JavaBeans (EJB) 照会を実行する場合は、 Query インターフェースで executeQuery メソッドを呼び出します。 executeQuery メソッドにはこのインターフェース用の必須トランザクション属性があります。 このため、照会を実行するためにトランザクション・コンテキストを明示的に確立する必要がありません。
以下のインポート・ステートメントで始めます。
import com.ibm.websphere.ejbquery.QueryHome; import com.ibm.websphere.ejbquery.Query; import com.ibm.websphere.ejbquery.QueryIterator; import com.ibm.websphere.ejbquery.IQueryTuple; import com.ibm.websphere.ejbquery.QueryException;
次に以下の例のように、照会ステートメントをストリングの形で書き込みます。例では低賃金従業員の名前と EJB 参照を検索しています。
String query = "select e.name as name , object(e) as emp from EmpBean e where e.salary < 50000";
QueryHome クラスから参照を取得して、Query オブジェクトを作成します。 (このクラスは executeQuery メソッドを定義します。) 簡素化するために、以下の例では Query オブジェクトに動的照会 JNDI 名を使用していることに注意してください。
InitialContext ic = new InitialContext(); Object obj = ic.lookup("com/ibm/websphere/ejbquery/Query"); QueryHome qh = ( QueryHome) javax.rmi.PortableRemoteObject.narrow( obj, QueryHome.class ); Query qb = qh.create();
次に、照会結果セットに最大のサイズを指定する必要があります。これはクラス QueryIterator に含まれた QueryIterator オブジェクトで定義されます。 次に、照会結果セットの最大のサイズを指定する必要があります。これは、QueryIterator オブジェクトで定義されます。このクラスは、QueryIterator API パッケージに含まれています。 この例では結果セットの最大サイズを 99 に設定しています。
QueryIterator it = qb.executeQuery(query, null, null ,0, 99 );
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) ); Emp e = ( Emp) javax.rmi.PortableRemoteObject.narrow( tuple.getObject(2), Emp.class ); System.out.println( e.getPrimaryKey().toString()); }
name Bob emp 1001 name Dave emp 298003 ...
} catch (QueryException qe) { System.out.println("Query Exception "+ qe.getMessage() ); }
リモート・インターフェース照会での大きな結果コレクションの処理
照会で大きなコレクションの戻り値があると思われる場合、複数のより小さな、より管理しやすい量で結果を戻すようにプログラミングすることができます。 リモートの executeQuery メソッドで skipRow および maxRow パラメーターを使用して、答えを複数の塊でリトリーブします。 以下に例を示します。
int skipRow=0; int maxRow=100; QueryIterator it = null; do { it = qb.executeQuery(query, null, null ,skipRow, maxRow ); while (it.hasNext()) { // display result skipRow = skipRow + maxRow; } } while ( ! it.isComplete() ) ;