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?

SpringbootのSpecificationでテーブルを複数JOINする

Posted at

こんにちは。
東です。

今回は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> 変数名の部分を
複製することで実現できると思います。

まとめ

いかがでしょうか。
実装の際は是非参考にしてみてください。

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?