EntityManager を使用した単純照会

WebSphere® eXtreme Scale には EntityManager 照会 API が入っています。

EntityManager 照会 API は、オブジェクトを照会する、SQL の他の照会エンジンにとても似ています。照会が定義されてから、各種の getResult メソッドを使用して、照会から結果が取り出されます。

以下の例は、「製品概要」にある EntityManager チュートリアル で使用されているエンティティーを参照しています。

単純照会の実行

次の例では、Claus という名字の顧客が照会されます。

em.getTransaction().begin();

  Query q = em.createQuery("select c from Customer c where c.surname='Claus'");

  Iterator iter = q.getResultIterator();
  while(iter.hasNext())
  {
    Customer c = (Customer)iter.next();
    System.out.println("Found a claus with id " + c.id);
  }

  em.getTransaction().commit();

パラメーターの使用

Claus という名字のすべての顧客の検索で、この照会を複数回使用する場合もあるので、名字を指定するパラメーターが使用されます。

定位置パラメーターの例

Query q = em.createQuery("select c from Customer c where c.surname=?1");
  q.setParameter(1, "Claus");

照会が複数回使用される場合、パラメーターの使用は非常に重要です。EntityManager は、照会ストリングを構文解析して、照会の計画をビルドする必要があり、これにはコストがかかります。パラメーターを使用することで、EntityManager は照会の計画をキャッシュに入れるので、照会の実行にかかる時間が削減されます。

定位置パラメーターと、名前が指定されたパラメーターの両方が使用されます。

名前が指定されたパラメーターの例

Query q = em.createQuery("select c from Customer c where c.surname=:name");
  q.setParameter("name", "Claus");

パフォーマンスを改善するための索引の使用

顧客が何百万人もいる場合には、前述の照会では、顧客マップ内のすべての行をスキャンする必要があります。これは、あまり効率的ではありません。しかし、eXtreme Scale は、エンティティーの個々の属性に対する索引を定義するための メカニズムを提供しています。照会では適宜、この索引が自動的に使用されるため、照会の速度が大幅に上がります。

エンティティー属性で @Index 注釈を使用すれば、索引付けする属性を非常に簡単に指定できます。

@Entity
public class Customer
{
  @Id String id;
  String firstName;
  @Index String surname;
  String address;
  String phoneNumber;
}

EntityManager は、名字属性に対する適切な ObjectGrid 索引を Customer エンティティー内に作成し、照会エンジンはこの索引を自動的に使用します。これにより、照会時間は大幅に短縮されます。

パフォーマンスを改善するためのページ編集の使用

Claus という名前の顧客が 100 万人いる場合には、100 万人の顧客を表示したページを表示するのは現実的ではありません。一度に 10 または 25 人の顧客を表示することになると考えられます。

Query setFirstResult メソッドおよび setMaxResults メソッドは、結果のサブセットのみを戻すため、役に立ちます。

ページ編集の例

Query q = em.createQuery("select c from Customer c where c.surname=:name");
  q.setParameter("name", "Claus");
  // Display the first page
  q.setFirstResult=1;
  q.setMaxResults=25;
  displayPage(q.getResultIterator());

  // Display the second page
  q.setFirstResult=26;
  displayPage(q.getResultIterator());