メタモデルなしで 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 使った方が簡単そう。

参考