クエリーを実行している対象のレジストリが、1 つまたは複数のレジストリ連携 (「レジストリとリポジトリについて」を参照) の一部である場合、そのレジストリメンバーとして含んでいるすべての連携内のすべてのレジストリに対して、あるいは 1 つの連携内のすべてのレジストリに対して、宣言型クエリーを実行できます。
レジストリをメンバーとして含んでいるすべての連携内のすべてのレジストリに対してクエリーを実行するには、実装に固有の setFederated メソッドを QueryImpl オブジェクトに対して呼び出します。このメソッドのシグニチャーは次のとおりです。
public void setFederated(boolean federated) throws JAXRException
このメソッドを次のように呼び出します。
QueryImpl query = (QueryImpl) dqm.createQuery(Query.QUERY_TYPE_SQL, qString); query.setFederated(true);
レジストリが 1 つの連携だけのメンバーであることがわかっている場合、クエリーを実行する前に呼び出す必要があるのはこのメソッドだけです。
1 つの連携内のレジストリにクエリーを限定するには、実装に固有の setFederation メソッドも追加で呼び出す必要があります。このメソッドは、クエリーを実行する連携の一意識別子を引数として取ります。
public void setFederation(java.lang.String federationId) throws JAXRException
したがって、このメソッドを呼び出す前に、一意の識別子の値を取得する必要があります。そのためには、まず BusinessQueryManagerImpl.findObjects を呼び出して、連携を名前で特定します。このコードで、文字列 "NameOfFederation" を連携の実際の名前に置き換えます。
Collection namePatterns = new ArrayList(); namePatterns.add("NameOfFederation"); // Find objects with name NameOfFederation BulkResponse response = bqm.findObjects("Federation", null, namePatterns, null, null, null, null);
次に、メンバーを 1 つだけ持っているコレクションを繰り返し処理して、キーの値を取得します。
String fedId = federation.getKey().getId();
最後に、クエリーを作成し、setFederated と setFederation を呼び出し、クエリーを実行します。
QueryImpl query = (QueryImpl) dqm.createQuery(Query.QUERY_TYPE_SQL, qString); query.setFederated(true); query.setFederation(fedId); response = dqm.executeQuery(query);
連携クエリーの使用例については、<INSTALL>/registry/samples/query-federation/src ディレクトリにある JAXRQueryFederation.java を参照してください。このサンプルは、見つかった各連携 (Service Registry に付属のデータベースに 1 つだけ含まれている) に対して、宣言型クエリーとストアドクエリーを実行します。
宣言型クエリーは、「宣言型クエリーの使用: 例」で実行したものです。ストアドクエリーは FindAllMyObjects クエリーです。このサンプルでユーザーの認証は行われないので、クエリーを実行するユーザーは RegistryGuest となります。RegistryGuest ユーザーが所有するオブジェクトは、それ自体の 1 つだけです。したがって、FindAllMyObjects クエリーによって返される結果は RegistryGuest ユーザーの 1 つだけです。