EntityManager API は、EntityManager API を使用して保管された ObjectGrid 内のデータを照会するためのメソッドを提供します。EntityManager 照会 API は、eXtreme Scale に定義された 1 つ以上のエンティティーに関する照会の作成と 実行に使用されます。
eXtreme Scale に保管されたエンティティーの拡張照会機能が WebSphere® Extended Deployment v6.1 で導入されました。これらの照会によって、 非キー属性を使用してオブジェクトを取り出すことや、照会条件と一致するすべてのデータに、合計、平均、最小、最大などの単純な集計を実行することができます。 アプリケーションは、EntityManager.createQuery API を使用して照会を構成します。 これにより、Query オブジェクトを戻した後、照会結果を取得するための問い合わせを受けることができます。また、照会オブジェクトを使用すれば、照会を実行する前にカスタマイズすることも可能です。 照会結果を戻す任意のメソッドが呼び出されると、照会は自動的に実行されます。
照会結果は、属性のリストです。 照会で、y=z の場合に X から a,b,c を選択すると、a、b、および c を含む行のリストが戻されます。 このリストは、トランザクション有効範囲マップに保管されます。 これはつまり、人工キーが各行と関連付けられており、各行で増加される整数を使用する必要があることを意味します。このマップは、Query.getResultMap メソッドを使用して取得されます。 マップには、関連付けられているマップ内の各行について説明する、EntityMetaData があります。以下のようなコードを使用して、各行のエレメントにアクセスすることができます。
Query q = em.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 ]);
}
以下のコードは、一致するカスタマーの特定部分の取得、および、結果行へのアクセス方法を示しています。 Query オブジェクトを使用してデータにアクセスする場合は、生成される long 行 ID は非表示になります。その long は、ObjectMap を使用して結果にアクセスした場合にのみ表示されます。トランザクションが完了すると、このマップは消えます。 マップは、使用されたセッション、つまり通常はそのマップを作成したスレッドに対してのみ可視となります。マップは単一の属性、long 行 ID を持つキーのタプルを使用します。 その値は、結果セット内の各列の属性を持つ別のタプルです。
以下は、これを示したサンプル・コードです。
Query 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();
Tuple keyTuple = qmap.getEntityMetadata().getKeyMetadata().createTuple();
for(long i = 0; true; ++i)
{
keyTuple.setAttribute(0, new Long(i));
Tuple row = (Tuple)qmap.get(keyTuple);
if(row == null) break;
System.out.println(" I Found a Claus with id " + row.getAttribute(0)
+ ", firstName: " + row.getAttribute(1)
+ ", surname: " + row.getAttribute(2));
}
以下のコードは、通常のマップ API を使用して各結果行を取得する、照会とループを示しています。マップのキーは Tuple です。 そのため、createTuple メソッドを使用して適切なタイプの 1 つを構成した結果は、keyTuple になります。rowIds を持つすべての行を、0 以上の値から取得しようとします。 キーが見つからなかったことを示すヌルが戻された場合、ループは終了します。keyTuple の最初の属性が、検索する long になるように設定します。 get によって戻される値も、照会結果内の各列の属性を持つタプルです。その後、getAttribute を使用して、値タプルから各属性をプルします。
以下は、次のコードの断片です。
Query q2 = em.createQuery("select c.id, c.firstName, c.surname from Customer c where c.surname=?1");
q2.setResultEntityName("CustomerQueryResult");
q2.setParameter(1, "Claus");
Iterator iter2 = q2.getResultIterator(CustomerQueryResult.class);
while(iter2.hasNext())
{
CustomerQueryResult row = (CustomerQueryResult)iter2.next();
// firstName is the id not the firstName.
System.out.println("Found a Claus with id " + row.id
+ ", firstName: " + row.firstName
+ ", surname: " + row.surname);
}
em.getTransaction().commit();
照会に ResultEntityName 値 が指定されています。この値は、各行を特定の 1 つのオブジェクト、この例では CustomerQueryResult に射影することを、照会エンジンに 指示します。クラスは次のとおりです。
@Entity
public class CustomerQueryResult {
@Id long rowId;
String id;
String firstName;
String surname;
};
最初のスニペットで、各照会行が Object[] ではなく CustomerQueryResult オブジェクトとして戻される点に注意してください。 照会の結果列は、CustomerQueryResult オブジェクトに射影されます。結果を射影することは、実行時には少し遅くなりますが、 読みやすさは優れています。照会結果エンティティーは、開始時に eXtreme Scale に登録されていてはなりません。エンティティーが 登録されている場合、同じ名前のグローバル・マップが作成され、マップ名が重複していることを示すエラーによって照会は 失敗します。