1
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 1 year has passed since last update.

Springにおける複数テーブルを結合したentityの書き方

Last updated at Posted at 2021-12-15

カスタムエンティティを作る

Java
@Entity 
public class customEntity {
    @Cplumn(name = "id")
    private int id;
}

結合した結果が複数テーブルのカラムを含む場合、取得対象カラムすべてに対応するプロパティをもったエンティティクラスが必要です。

使用するDaoのメソッド定義は次のとおりです。

@Select
List<EmployeeDepartment> selectAllEmployeeDepartment();

戻り値のListの要素であるEmployeeDepartmentが結合した結果に対応するエンティティクラスです。 このエンティティクラスは、結合のベースとなるテーブルに対応するエンティティクラスを継承すると比較的に簡単に作成できます。

複数のテーブルを結合した結果に対応するエンティティを作ろうとしているが、
テーブルAとテーブルBに同一のカラム名がある場合はどうすれば良いのだろう。。
下記の場合、nameがテーブルAとテーブルBにもある。それぞれデータを独自に持っている。

@Entity
public class ContractorWithParents extends Contractor {

    @Column(name = "app_id")
    String appId;

    @Column(name = "name")
    String name;

    @Column(name = "name")
    String departmentName;

    ...

}

ここに答えが載っていた。

このクラスは、Employeeクラスを継承し、DEPARTMENTテーブルのNAMEカラムに対応するプロパティを持ちます。 @Columnのname要素に指定されている「DEPARTMENT_NAME」はSQL上でDEPARTMENTテーブルのNAMEカラムの別名になります。

@Entity
public class EmployeeDepartment extends Employee {

    @Column(name = "DEPARTMENT_NAME")
    String departmentName;

    ...
}

Daoメソッドに対応するSQLファイルのパスはMETA-INF/tutorial/dao/EmployeeDao/selectAllEmployeeDepartment.sqlです。 SQLは次のように記述されています。

select
  e.*,
  d.name department_name 
from 
  employee e 
left outer join 
  department d 
on 
  e.department_id = d.id 
order by 
  e.id

Daoのメソッドは次のように呼び出します。

List<EmployeeDepartment> list = dao.selectAllEmployeeDepartment();

参考

1
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
1
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?