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());