2005.11.09 · 技術と道具

Hibernateをいじる(6)

久しぶりですが、Hibernate。
次は、SELECT系をまとめておきます。

1.get()で取る

単純に主KEYで取る場合に使用します。DBに該当レコードがない場合はnullが返ります。
似て非なるものにload()もあります。こちらはDBに該当レコードがないと例外になります。プロキシを使う場合だと、プロキシオブジェクトが返ります。
深いことを考えなければ、get()で良いでしょう。

JAVA
Student erika = (Student)session.get(Student.class, new Long(1));

2.Queryで取る

複数レコードが必要だったり、主KEY以外で検索するなら、get()やload()ではダメです。
HQLを使いましょう。

JAVA
Query query = session.createQuery("FROM Student");
List studentList = query.list();

もうちょっと複雑な例。

JAVA
Query query = session.createQuery("FROM Study AS study WHERE study.student.gakusekiNo=~ AND study.subject.code=~");
query.setString(0, "0499001");
query.setString(1, "14501");
Study study = (Study)query.uniqueResult();

このように、ちょうどPreparedStatementのようなことが出来ます。
注目する点は2つ。
1つは、Study AS studyのように、別名をつけている点です。WHERE句で使用するクラスは別名を付け、WHERE句は別名で指定します。
もう1つは、study.subject.code=~のような指定方法。WHERE句での検索条件が、FROM句で指定したテーブルではなく、何らかのJOINを行った先のテーブルのカラムである場合、SQLならJOINの指定が必要です。しかし、HQLではそれは不要で、単純に取得したいクラスをFROM句で指定し、あとはWHERE句でstudy→subject→codeとJavaオブジェクトのプロパティ名でたどっていけばOKです。クラス間(テーブル間)のマッピングが、設定ファイルで定義されているためでしょう。

2005/11/09 21:50
← Web2.0とは、集合知を利用するために、Webをプラットフ…
Hibernateをいじる(7) →
井上 研一
経済産業省推進資格ITコーディネータとして中小企業のDX・AI活用の現場で伴走支援を行う。「ITCプロセスガイドライン4.0」および「中小企業向けAI活用ガイド」執筆メンバー。著書・講演多数。ITエンジニアとして25年以上の実務経験。AI導入の実務に10年以上携わる。自ら開発したAIサービス「Gen2Go」が北九州発!新商品創出事業の認定を受ける。2026年4月より北九州市立大学大学院マネジメント研究科の学生としての顔も持つ。

本サイトおよびブログに掲載している内容は、特に明記のない限り、井上研一個人の見解に基づくものです。所属・関与する組織、団体、企業、研究会等の公式見解を示すものではありません。