Hibernateをいじる(6)

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

1.get()で取る

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

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

2.Queryで取る

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

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

もうちょっと複雑な例。

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です。クラス間(テーブル間)のマッピングが、設定ファイルで定義されているためでしょう。

この記事を書いた人

井上 研一

株式会社ビビンコ代表取締役、ITエンジニア/経済産業省推進資格ITコーディネータ。AI・IoTに強いITコーディネータとして活動。画像認識モデルを活用したアプリや、生成AIを業務に組み込むためのサービス「Gen2Go」の開発などを行っている。近著に「使ってわかった AWSのAI」、「ワトソンで体感する人工知能」。日本全国でセミナー・研修講師としての登壇も多数。