宣言型クエリーでは非常に大きな結果セットが返されると予測される場合には、実装に固有の繰り返し型クエリー機能を使用できます。DeclarativeQueryManagerImpl.executeQuery メソッドには、一連のパラメータを指定する引数を 1 つ指定できます。このメソッドのシグニチャーは、次のとおりです。
public BulkResponse executeQuery(Query query, java.util.Map queryParams, IterativeQueryParams iterativeParams) throws JAXRException
結果セットのうち、各クエリーでそれぞれ異なるサブセットを要求するように、パラメータを指定できます。1 つのクエリーで結果セット全体を取得する代わりに、個々のクエリーで扱いやすい分量の結果セットを取得できます。
最大 100 個の結果を返すクエリー文字列があるとします。一連のパラメータを作成して、このクエリーで一度に 10 個の結果を返すようにすることができます。まず、IterativeQueryParams クラスのインスタンスを作成します。このクラスは、org.freebxml.omar.common パッケージで定義されています。このクラスの 2 つのフィールドは、配列の開始インデックスを表す startIndex と、返す結果の最大数を表す maxResults です。これらのフィールドの初期値はコンストラクタで指定します。
int maxResults = 10; int startIndex = 0; IterativeQueryParams iterativeQueryParams = new IterativeQueryParams(startIndex, maxResults);
for ループで各クエリを実行します。このループは、クエリーごとに maxResults の値だけ増加し、予測される最大結果数に達すると終了します。ループの繰り返しごとに startIndex フィールドを増分します。
for (int i = 0; i < 100; i += maxResults) { // Execute query with iterative query params Query query = dqm.createQuery(Query.QUERY_TYPE_SQL, queryStr); iterativeQueryParams.startIndex = i; BulkResponse br = dqm.executeQuery(query, null, iterativeQueryParams); Collection objects = br.getCollection(); // retrieve individual objects ... }
Service Registry では、クエリーの繰り返しの間にトランザクションの整合性や状態を維持する必要はありません。したがって、繰り返しの間に、完全な結果セットに対して新しいオブジェクトを追加することや既存のオブジェクトを削除することも可能です。そのため、繰り返しの間に結果セットの要素が抜けたり重複したりすることもあります。
繰り返し型クエリーの使用例については、<INSTALL>/registry/samples/query-iterative/src ディレクトリにある JAXRQueryIterative.java を参照してください。このプログラムは、特定の文字列に一致する名前を持つすべてのレジストリオブジェクトを検索し、最初の 100 個を繰り返し処理します。