0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

S2JDBCでのテーブル結合

Last updated at Posted at 2020-04-23

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のエンティティクラスにアノテーションをつけていきます。

Employee.java
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の方の記述です。

Department.java
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でレコードを検索・取り出すときは、こんな感じ。

Service.java
	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("プロパティ名")等を結合したいテーブルの分記述

おわり

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?