EntityManager の取得
以下のようなコードで EntityManager を取得して使用する。
1 2 3 4 5 6 7 8 9 |
EntityManagerFactory emf; try { // persistence.xml の // persistence-unit name="名称" の名称を引数にする emf = Persistence.createEntityManagerFactory("名称"); } catch (Exception e) { throw new ExceptionInInitializerError(e); } EntityManager em = emf.createEntityManager(); |
エンティティクラスの定義は以下の通り。
1 2 3 4 5 6 7 |
@Entity @Table(name = "sample_table") public class SampleTable { @Id @Column(name="sample_id", unique=true, nullable=false) private int sampleId; … |
主キー検索
下記の例では、SampleTableの主キーが「aaa」のレコードを1件取得する。
1 |
SampleTable sampleTable = em.find(SampleTable.class, "aaa"); |
JPQL(createQuery)
下記の例では、SampleTableの全件をsampleIdの昇順で取得する。
1 2 3 |
List<SampleTable> list = em.createQuery("select s from SampleTable s order by s.sampleId") .getResultList(); |
注意点
DB上のテーブルは「sample_table」、列名は「sample_id」だが、JPQLに記述するのは、Java側のエンティティクラスで定義したクラス名やフィールド(getterメソッド)名である。
取得列の指定時
列指定を行った場合、エンティティクラスの型では受け取れず、1レコードがObject配列となったリストで受け取ることになる。
1 2 3 |
List<Object[]> list = em.createQuery("select s.sampleId from SampleTable s" +) .getResultList(); |
動的条件
パラメータを「?1」「?2」のように「?番号順」につけていくパターン。Query#setParameter(番号, 値)でパラメータをセット。
1 2 3 4 5 |
List<SampleTable> list = em.createQuery("select s from SampleTable s " + " where s.sampleId = ?1") .setParameter(1, "aaa") .getResultList(); |
パラメータの名前を「:パラメータ名」で指定するパターン。Query#setParameter(パラメータ名, 値)でパラメータをセット。
1 2 3 4 5 |
List<SampleTable> list = em.createQuery(" select s from SampleTable s " " where s.sampleId = :sampleid") .setParameter("sampleid", "aaa") .getResultList(); |
JPQL(createNamedQuery)
エンティティクラスに、以下を追記する。
1 2 3 4 5 6 7 8 9 10 11 |
@Entity @Table(name = "sample_table") @NamedQueries({ @NamedQuery( name="query1", query="select s from SampleTable s order by s.sampleId"), @NamedQuery( name="query2", query="select s from SampleTable s order by s.sampleId desc") }) public class SampleTable { |
そして以下を実行。下記の例では、SampleTableの全件をsampleIdの降順で取得する。
<
pre class=”lang:java decode:true “”>List<SampleTable> list =
em.createNamedQuery(“query2”)
.getResultList();
その他、基本的にはcreateQueryと一緒。
※Eclipseでエンティティクラスの自動生成ができることを考えると、エンティティクラスを手書きでいじる必要のあるcreateNamedQueryはなるべく使いたくないかもしれない。
Criteria
くらいてりあ。タイプセーフなのがウリとか。詳しくは知らないのでそのうち調べて追記できたらいいな。