Oracle SQL Developerしか触ったことない私がS2JDBCでのテーブル結合にかなり苦戦したので、過去の私への備忘録です。
◆S2JDBCでの結合のポイント
(1)結合先・結合元のテーブルのエンティティクラスにアノテーションをつける必要がある。
アノテーションは、「多対一(@ManyToOne)」と「一対多(@OneToMany)」がセット
(2)それをもとにサービスクラスで結合の記述をする。
(3)複数のテーブルの結合も同様に可能。
◆(1)エンティティにアノテーションをつける
2つのテーブルについて、**外部キーを持つ方(所有者)と持たない方(被所有者)**の区別をしっかりつける。
ここでは、外部キーを持つ方 ⇒ 従業員テーブル
持たない方 ⇒ 部署テーブル とします。
たとえばテーブルの中身はこんな感じ…
【従業員】Employee
id | name | dep_id |
---|---|---|
1 | john | 3 |
2 | kate | 1 |
3 | perry | 2 |
4 | smith | 1 |
★dep_idが外部キー |
【部署】Department
id | dep |
---|---|
1 | 営業 |
2 | 経理 |
3 | 人事 |
まずEmployeeのエンティティクラスにアノテーションをつけていきます。
public class Employee implements Serializable {
private static final long serialVersionUID = 1L;
....
/** dep_idプロパティ */
@Column(length = 20, nullable = false, unique = false)
public String dep_id;
/** Departmentプロパティ */ //(1)外部キーで呼び出すテーブルのエンティティ定義を追加する。
@ManyToOne //(2)Employeeから見たDepartmentは「多対一」の関係なので、ManyToOneアノテーションをつける。
@JoinColumn(name="dep_id", referencedColumnName="id")
//(3)結合するカラムを指定。nameにEmployee、referencedColumnNameにDepartmentのカラムをプロパティ名で記載。
public Department department; // (4)Departmentのプロパティ名をここで指定。
}
次に、Departmentの方の記述です。
public class Department implements Serializable {
private static final long serialVersionUID = 1L;
....
/** depプロパティ */
@Column(length = 20, nullable = false, unique = false)
public String dep;
/** employeeListプロパティ */ //(1) DepartmentではEmployee型リストのプロパティを定義することに注意。
@OneToMany(mappedBy="department")
//(2)Departmentから見たEmployeeは「一対多」の関係なので、OneToManyアノテーションをつける。
// mappedByには、Employeeエンティティで指定したプロパティ名を記載。
public List<Employee> employeeList; // (3) 結合したテーブルのエンティティのプロパティ名を指定。
}
これでエンティティの編集は終了!
◆(2)サービスクラスでの結合の記述
例えば結合したテーブルから、部署IDでレコードを検索・取り出すときは、こんな感じ。
public List<Employee> findById(String dep_id) {
List<Employee> employeeList= jdbcManager
.from(Employee.class) // 主キーを持つテーブルのエンティティクラス
.innerJoin("department", // ↑で指定したプロパティ名
new SimpleWhere() // 検索条件の指定
.eq("department.id", dep_id)) //("テーブルプロパティ名.カラムプロパティ名", 引数)
.getResultList();
return employeeList;
※innnerJoin以外にも結合方法はあるので、使いたい場合は公式サイトで確認しましょう
◆(3)複数テーブルの結合
複数テーブルでもやることは同じ感じです。
1)外部キーを持つテーブルのエンティティクラスに、結合したいテーブル分のエンティティ定義を追加
2)外部キーを持たないテーブルに、それぞれリストのプロパティを定義
3)サービスクラスの .innerJoin("プロパティ名")等を結合したいテーブルの分記述
おわり