こんにちは。
東です。
今回はSpringbootのSpecificationでテーブルを複数JOINする作成例
についてまとめました。
今回例として以下のテーブルを結合したいとします。
【Accountテーブル】
account_id | account_name | account_department_id | account_prefectures_id |
---|---|---|---|
A0001 | 田中 | DEP0001 | PRE0003 |
A0002 | 佐藤 | DEP0002 | PRE0002 |
A0003 | 山本 | DEP0003 | PRE0001 |
【AccountDepartmentテーブル】
account_department_id | account_department_name |
---|---|
DEP0001 | 営業 |
DEP0001 | 人事 |
DEP0001 | 技術 |
【AccountPrefecturesテーブル】
account_prefectures_id | account_prefectures_name |
---|---|
PRE0001 | 東京 |
PRE0002 | 北海道 |
PRE0003 | 沖縄 |
作成例
AccountテーブルにAccountDepartmentテーブルとAccountPrefecturesテーブルを結合,
Accountテーブルを検索するという想定です。
以下Specification参考コードです。
Specification.java
private static Specification<Account> joinTable() {
return (root, query, builder) -> {
List<Predicate> predicateList = new ArrayList<>();
// AccountDepartmentテーブルを結合
Join<Account, AccountDepartment> joinDepartment =
root.join("AccountDepartment", JoinType.LEFT);
// 紐づけのカラムを指定(両者テーブルのaccountDepartmentIdを結合)
Predicate departmentLink =
builder.equal(departmentLink.get("accountDepartmentId"), accountDepartmentId);
predicateList.add(departmentLink);
// AccountPrefecturesテーブルを結合
Join<Account, AccountPrefectures> joinPrefectures =
root.join("AccountPrefectures", JoinType.LEFT);
// 紐づけのカラムを指定(両者テーブルのaccountPrefecturesIdを結合)
Predicate PrefecturesLink =
builder.equal(PrefecturesLink.get("accountPrefecturesId"), accountPrefecturesId);
predicateList.add(PrefecturesLink);
Predicate[] predicateArray = predicateList.toArray(new Predicate[predicateList.size()]);
return builder.and(predicateArray);
};
}
こうすることによって、Jpaリポジトリで2個のテーブルを結合することができます。
結合テーブルを増やす場合などもJoin<テーブル1, テーブル2> 変数名
の部分を
複製することで実現できると思います。
まとめ
いかがでしょうか。
実装の際は是非参考にしてみてください。