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