メタモデルなしで JPA 2.0 の Criteria API を使う
仕様書のサンプルや Web の記事を見ると、JPA 2.0 の Criteria API を使うにはメタモデルを作らないといけないかと一瞬思うけれど、属性名を文字列で指定してもいいんですね。
メタモデルを使用する場合、
@Entity public class Customer { @Id Long id; String name; ... }
というエンティティに対して、
@StaticMetamodel(Customer.class) public class Customer_ { public static volatile SingularAttribute<Order, Long> id; public static volatile SingularAttribute<Order, String> name; ... }
のようなメタモデルを作って、
@PersistenceContext EntityManager em; CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery<Customer> cq = cb.createQuery(Customer.class); Root<Customer> r = cq.from(Customer.class); cq.select(r).where(cb.equal(r.get(Customer_.name), "hoge")); List<Customer> result = em.createQuery(cq).getResultList();
のようにするみたいですが、
メタモデルを作らずに、
@PersistenceContext EntityManager em; CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery<Customer> cq = cb.createQuery(Customer.class); Root<Customer> r = cq.from(Customer.class); cq.select(r).where(cb.equal(r.get("name"), "hoge")); List<Customer> result = em.createQuery(cq).getResultList();
としても良いみたいです。
自社フレームワークなどで使う場合はこちらの方が使いやすそう。
というか、アプリケーションのプログラマにこれを使いこなせっていうのは厳しくないかな? 素直に JPQL や SQL 使った方が簡単そう。
参考
- JSR 317: Java Persistence 2.0
http://jcp.org/en/jsr/detail?id=317 - Dynamic, typesafe queries in JPA 2.0 - developerWorks
http://www.ibm.com/developerworks/java/library/j-typesafejpa/ - NetBeans6.8 BetaでJPA2.0を試してみる。 - ひたすらプログラミング日記
http://d.hatena.ne.jp/hayassh/20091025/1256477014