ObjectQuery API の使用

ObjectQuery API は、ObjectMap API を使用して保管された ObjectGrid 内のデータを照会するためのメソッドを提供します。スキーマが ObjectGrid インスタンスで定義される場合、ObjectQuery API を使用して、オブジェクト・マップに保管されている異種のオブジェクトに対して照会を作成し、実行することができます。

照会とオブジェクト・マップ

ObjectMap API を使用して保管されたオブジェクトに対して、拡張された照会機能を使用できます。 これらの照会によって、非キー属性を使用してオブジェクトを取り出すことや、照会条件と一致するすべてのデータに、sum、avg、min、max などの単純な集計を実行することができます。アプリケーションは、Session.createObjectQuery メソッドを使用して照会を構成できます。このメソッドは、ObjectQuery オブジェクトを戻します。このオブジェクトはその後、照会結果を取得するための問い合わせを受けることができます。また、照会オブジェクトを使用すれば、照会を実行する前にカスタマイズすることも可能です。 照会結果を戻す任意のメソッドが呼び出されると、照会は自動的に実行されます。

図 1. ObjectGrid オブジェクト・マップと照会との対話、 および、スキーマがどのようにクラスに対して定義され、ObjectGrid マップと関連付けられるか
ObjectQuery スキーマ、セッション、およびアプリケーション

ObjectMap スキーマの定義

オブジェクト・マップは、さまざまな形式でオブジェクトを保管するために使用されるため、多くの場合、形式を認識しません。スキーマは、データのフォーマットを定義する ObjectGrid で定義される必要があります。スキーマは、以下のもので構成されます。

  • ObjectMap に保管されているオブジェクトのタイプ
  • ObjectMap 間のリレーションシップ
  • それぞれの照会がオブジェクト (フィールドまたはプロパティー・メソッド) 内のデータ属性へのアクセスに使用するメソッド
  • オブジェクト内の 1 次キー属性名。

詳細については、『ObjectQuery スキーマの構成』を参照してください。

スキーマをプログラマチックに作成する例、または ObjectGrid 記述子 XML ファイルを使用する例については、ObjectQuery チュートリアル - ステップ 3を参照してください。

ObjectQuery API を使用したオブジェクトの照会

ObjectQuery インターフェースを使用して、 非エンティティー・オブジェクト (ObjectGrid ObjectMap に直接保管された異種のオブジェクト) の照会を 行うことができます。ObjectQuery API には、索引メカニズムを直接使用することなく、ObjectMap オブジェクトを簡単に検索する方法があります。

ObjectQuery から結果を取得するには、getResultIterator と getResultMap の 2 つのメソッドがあります。

getResultIterator を使用した照会結果の取得

照会結果とは、基本的に属性のリストのことです。 照会で、y=z の場合に X から a,b,c を選択するとします。 この照会では、a、b、および c を含む行のリストが戻されます。 このリストは実際に、トランザクション有効範囲マップに保管されます。 つまり、人工キーを各行と関連付け、各行で増加される整数を使用する必要があります。 このマップは、ObjectQuery.getResultMap() メソッドを使用して取得します。以下のようなコードを使用して、各行のエレメントにアクセスすることができます。

ObjectQuery q = session.createQuery(
    "select c.id, c.firstName, c.surname from Customer c where c.surname=?1");

  q.setParameter(1, "Claus");

  Iterator iter = q.getResultIterator();
  while(iter.hasNext())
  {
    Object[] row = (Object[])iter.next();
    System.out.println("Found a Claus with id "
      + row[objectgrid: 0 ] + ", firstName: "
      + row[objectgrid: 1 ] + ", surname: "
      + row[objectgrid: 2 ]);
  }

getResultMap を使用した照会結果の取得

また、照会結果は、結果マップを直接使用して取得することもできます。 以下の例は、一致するカスタマーの特定部分を取得する照会、および、結果行へのアクセス方法を示しています。 ObjectQuery オブジェクトを使用してデータにアクセスする場合は、生成される long 行 ID は非表示になりますので注意してください。その long 行は、ObjectMap を使用して結果にアクセスした場合にのみ表示されます。

トランザクションが完了すると、このマップは消去されます。 また、マップは使用されたセッション、つまり通常はそのマップを作成したスレッドに対してのみ可視となります。マップは、行 ID を表す Long タイプのキーを使用します。 マップに保管される値は、Object タイプか Object[] タイプのいずれかです。 Object[] タイプの場合、各エレメントは、選択された照会の文節にあるエレメントのタイプと同じになります。

ObjectQuery q = em.createQuery(
      "select c.id, c.firstName, c.surname from Customer c where c.surname=?1");
  q.setParameter(1, "Claus");
  ObjectMap qmap = q.getResultMap();
  for(long rowId = 0; true; ++rowId)
  {
    Object[] row = (Object[]) qmap.get(new Long(rowId));
    if(row == null) break;
    System.out.println(" I Found a Claus with id " + row[0]
      + ", firstName: " + row[1]
      + ", surname: " + row[2]);
  }

ObjectQuery の使用例については、チュートリアル: ローカルのメモリー内データ・グリッドの照会を参照してください。