JavaEE 7 JPA 2.1の新機能 動的なNamedQuery作成

JPAは基本的なCRUDは標準で使え(データマッパーパターンなので当たり前)、定型的なクエリはNamedQueryとしてあらかじめ静的に設定しておくことができる。

しかし、完全に静的ではなく、起動時に少しいじりたいなどほんの少し動的な性的静的なクエリを作りたいこともあるはずだ。


というわけで、2.1ではNamedQueryをコードで作れるようになった。

定義

EntityManager em = emf.createEntityManager();

String sql = "select address , count(*) as count from customer group by address";
Query q = em.createNativeQuery(sql,"address_count");
em.getEntityManagerFactory().addNamedQuery("native", q);

String jpql = "select NEW jpatest.Hoge(c.address, count(c)) from Customer c group by c.address";
TypedQuery q2 = em.createQuery(jpql, Hoge.class);
em.getEntityManagerFactory().addNamedQuery("jpql", q2);
            
em.close();

注意するのはEntityManagerではなくEntityManagerFactoryであること。

また、渡すのはJPQLなど文字列ではなくQueryであること。引数はQueryなのでQuery以外にもそれを継承しているTypedQueryやNativeQuery、ストアドプロシージャのクエリであるStoredProcedureQueryを渡せる。

ただし、addはできても、removeはできないようなので、アプリの中でどうてきにつくるというたぐいのものではないようだ。起動時に環境に合わせて1度設定する、ような使い方だろう。