読者です 読者をやめる 読者になる 読者になる

JPA2ではEntityManagerなしでCriteriaを作る方法がない?

JPA2では以下のようにしてCriteriaを生成します。

// entityManagerFactory.getCriteriaBuilder(); でもOK
entityManager.getCriteriaBuilder();
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Company> cq = cb.createQuery(Company.class);
Root<Company> root = cq.from(Company.class);

ここで気になるのが以下のようなこと。

  • JPQLのNamedQueryのようなことができないのか?
  • JDBCのPrepearedStatementのようなことができないのか?
  • Criteriaを毎回生成すると地味にコストがかかっているのではないか?

ということでどこか別のところに予めCriteriaを生成して、利用するときにパラメータだけ渡して実行できないのか調べてみました。
結論としては"なさそう"です。

どこかでそんなことができたように記憶していたと思い調べてみたらそれはHibernateのようでした。
Hibernateだと以下のようなことが可能です。
ドキュメントから引用

DetachedCriteria query = DetachedCriteria.forClass(Cat.class)
    .add( Property.forName("sex").eq('F') );
....
Session session = ....;
Transaction txn = session.beginTransaction();
List results = query.getExecutableCriteria(session).setMaxResults(100).list();

JPA2のクライテリアはタイプセーフなのは評価できるけれど、APIのセンスが微妙…。