多対一の関係にあるテーブルのデータも読み込むためには、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 件のコメント:
コメントを投稿