9. JPA2のメタモデルを使用しタイプセーフなクライテリアクエリの実行

JPA2の仕様では、永続性ユニットで管理されているクラスの永続状態、関連のメタモデルを表現するMetamodelクラスが定義されています。正式なメタモデルクラスが、仕様で定められたルールに従って注釈プロセッサにより静的に自動生成されます。

この抽象的な永続性スキーマはクライテリアAPIを使ってタイプセーフなクエリを記述するために用いられ、Java Persistence Query Language (JPQL)による文字列ベースなアプローチを対象的です。

このセクションではJPA2のクライテリアAPIを使ってタイプセーフなクエリを作成します。

  1. プロジェクトを右クリックして“Clean and Build”を選択し、JPAエンティティに対するメタモデルクラスを自動生成してください。プロジェクトエクスプローラーは次のようになります。

JPA2の仕様で正式なメタモデルを定義しています。NetBeansはプロジェクトがビルドされたときに、“EclipseLink Canonical Metamodel Generator”を使用してメタモデルを自動生成します。

自動生成された Address_.java クラスは次のようになります。

package org.glassfish.samples.entities;
import javax.annotation.Generated;
import javax.persistence.metamodel.SingularAttribute;
import javax.persistence.metamodel.StaticMetamodel;
import org.glassfish.samples.entities.MicroMarket;
@Generated(value="EclipseLink-2.2.0.v20110202-r8913", date="2011-11-07T16:13:45")
@StaticMetamodel(Address.class)
public class Address_ {
    public static volatile SingularAttribute<Address, String> addressline2;
    public static volatile SingularAttribute<Address, MicroMarket> zip;
    public static volatile SingularAttribute<Address, String> addressline1;
    public static volatile SingularAttribute<Address, String> state;
    public static volatile SingularAttribute<Address, String> city;
}

このクラスはAddressエンティティの各々のフィールドの型をカーディナリティを提供します。

  1. 次のコードを CustomerSessionBean.java に追加してください:
public List<Customer> getCustomers2() {
    CriteriaBuilder builder = em.getCriteriaBuilder();
    CriteriaQuery criteria = builder.createQuery(Customer.class);
    // FROM clause
    Root root = criteria.from(Customer.class);
    // SELECT clause
    criteria.select(root);
    // No WHERE clause
    // FIRE query
    TypedQuery query = em.createQuery(criteria);
    // PRINT result
    return query.getResultList();
}

このメソッドは前述の getCustomers メソッドと同じく、データベースから全ての顧客をリスト形式で返却します。ただし、データベースへの問い合わせにタイプセーフなクライテリアAPIを使用しています。

自動生成されたメタモデルはこの後使用します。

全ての情報が文字列を一切使うことなく指定されていることに着目してください。

Fix the imports by taking all the defaults.

  1. “TestServlet.java”で次のコードを
List<Customer> result = bean.getCustomers();

次のコードで置き換えてください。

List<Customer> result = bean.getCustomers2();

これで新しいEJBの機能が呼ばれます。

importを修正してください。

  1. http://localhost:8080/JavaEE6SampleApp/TestServlet”を再読み込みしてください。以下の結果がブラウザに表示されます。

期待した通り、出力結果に変わりはありません。

Project Versions

前のトピックへ

8. EJBを使用してデーターベースに値を追加し、Bean Validationで入力チェック

次のトピックへ

10. シングルトンEJBと@Scheduleでデータをプリフェッチしたキャッシング

このページ