2011年11月11日金曜日

[hibernate][select][join]多対一の関係にあるテーブルで結合を行う

多対一の関係にあるテーブルのデータも読み込むためには、HQL内でjoinを呼び出す。
(joinをHQLに書かなくても読み込むことができるが、バックグラウンドで発行されるSQLは複数になる)

例えば「サンプルサービスユーザ」に「都道府県」の情報が付随しているとする。
ユーザが住んでいる都道府県がデータベースに格納される仕様だとすると、ユーザの分だけ都道府県の情報が登録される。
「サンプルサービスユーザ」と「都道府県」は、多対一の関係になる。

このときエンティティのコードは、次のようになる。(setter/getter省略)

    /** 都道府県 */
    @Entity(name = "PREF")
    public class Pref {

        /** 都道府県ID */
        @Id
        @GeneratedValue
        @Column(name = "PREF_ID")
        private Integer prefId;

        /** バージョン(楽観ロック用) */
        @Version
        @Column(name = "VERSION")
        private Integer version;

        /** 都道府県名 */
        @Column(name = "PREF_NAME")
        private String prefName;
    }

    /** サンプルサービスユーザ */
    @Entity(name = "SAMPLE_SERVICE_USER")
    public class SampleServiceUser {

        /** ユーザID */
        @Id
        @GeneratedValue
        @Column(name = "SAMPLE_SERVICE_USER_ID")
        private Integer sampleServiceUserId;

        /** バージョン(楽観ロック用) */
        @Version
        @Column(name = "VERSION")
        private Integer version;

        /** メールアドレス */
        @Column(name = "MAIL")
        private String mail;

        /** パスワード */
        @Column(name = "PASSWORD")
        private String password;

        /** ニックネーム */
        @Column(name = "NICKNAME")
        private String nickname;

        /** 都道府県 */
        @ManyToOne
        @JoinColumn(name = "PREF_ID")
        private Pref pref;
    }

@ManyToOneアノテーションにより、都道府県テーブルとの多対一の関係を明示する。
@JoinColumnアノテーションにより、外部キーを指定する。
HQLは、次の通り。(セッション取得までは省略)

    // 登録ユーザIDによる検索を行う
    List list = session.createQuery(
            "from SAMPLE_SERVICE_USER u" + " inner join u.pref p").list();

このように記述することで、バックグラウンドではINNER JOINのSQLが発行される。
このクエリでSAMPLE_SERVICE_USERエンティティを読み込むと、prefの中に都道府県の情報も入っている。

0 件のコメント:

コメントを投稿