JPA2の仕様では、永続性ユニットで管理されているクラスの永続状態、関連のメタモデルを表現するMetamodelクラスが定義されています。正式なメタモデルクラスが、仕様で定められたルールに従って注釈プロセッサにより静的に自動生成されます。
この抽象的な永続性スキーマはクライテリアAPIを使ってタイプセーフなクエリを記述するために用いられ、Java Persistence Query Language (JPQL)による文字列ベースなアプローチを対象的です。
このセクションではJPA2のクライテリアAPIを使ってタイプセーフなクエリを作成します。
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エンティティの各々のフィールドの型をカーディナリティを提供します。
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.
List<Customer> result = bean.getCustomers();
次のコードで置き換えてください。
List<Customer> result = bean.getCustomers2();
これで新しいEJBの機能が呼ばれます。
importを修正してください。
期待した通り、出力結果に変わりはありません。