S2JDBCでのjoinについての備忘録

業務でS2JDBCを使っているのですが、テーブル結合のやり方がわかったので簡単に備忘録を残します。

ポイントは、

  1. テーブル間の結合定義
    1. プロパティの追加
    2. アノテーションの設定
    3. 結合カラムの設定
  2. joinの記述

です。

例題

以下のような二つのテーブルをinner joinしてみよう。

TABLE_ONE

名前 P
id int
name varchar(20)
info_id int
crete_time datetime

TABLE_TWO

名前 P
id int
keyword varchar(20)
crete_time datetime

なお、二つのテーブルの関係性はテーブル1:テーブル2 = n:1(多対1)。
外部キーは使わない物とする。
TABLE_ONEのエンティティ名をTableOne、TABLE_TWOのエンティティ名をTableTwoとする。

テーブル間の結合定義

プロパティの追加

まずテーブル同士の結合を定義する(?)ために、各エンティティにプロパティを追加します。

public class TableOne {
  //テーブルのカラムに対応したプロパティ
  public int  id;
  public String name;
  public int info_id;
  public TimeStamp create_time
  //テーブル間の結合を定義
  public TableTwo tableTwo; //<--結合先のエンティティを追加
}

public class TableTwo {
  //テーブルのカラムに対応したプロパティ
  public int id;
  public String keyword;
  public TimeStamp create_time;
  //テーブル間の結合を定義
  public List<TableOne> tableOneList; //<--結合先のエンティティを追加
}

テーブルが多対1で結合する場合、

  • 多のエンティティに1のエンティティを、 ----A
  • 1のエンティティに多のエンティティを、 ----B

プロパティとして定義します。
ここで注意が必要なのは、Bの場合はプロパティをListとして追加することです。

アノテーションの設定

続いて、追加したプロパティに多対1の関連性を定義するため、アノテーションを設定します。

public class TableOne {
  //テーブルのカラムに対応したプロパティ
  public int  id;
  public String name;
  public int info_id;
  public TimeStamp create_time
  //テーブル間の結合を定義
  @ManyToOne                //<--TableOneが多対1の多であることを追加
  public TableTwo tableTwo;
}

public class TableTwo {
  //テーブルのカラムに対応したプロパティ
  public int id;
  public String keyword;
  public TimeStamp create_time;
  //テーブル間の結合を定義
  @OneToMany(mappedBy="tableTwo")   //<--TableTwoが多対1の1であること、自身がTableOneで
                   //   tableTwoとして定義されていることを追加
  public List<TableOne> tableOneList; 
}
結合カラムの設定

さて、結合の定義の詰めとしてどのカラムを結合条件として使うかを設定します。

public class TableOne {
  //テーブルのカラムに対応したプロパティ
  public int  id;
  public String name;
  public int info_id;
  public TimeStamp create_time
  //テーブル間の結合を定義
  @ManyToOne
  @JoinColumn(name="info_id", referencedColumnName="id") //<--結合カラムを指定
  public TableTwo tableTwo; 
}

public class TableTwo {
  //テーブルのカラムに対応したプロパティ
  public int id;
  public String keyword;
  public TimeStamp create_time;
  //テーブル間の結合を定義
  @OneToMany(mappedBy="tableTwo")
  public List<TableOne> tableOneList; //<--結合先のエンティティを追加
}

@ManyToOneが設定されている方に、@JoinColumnを追記することで実現します。
()のnameでTableOne、referencedColumnNameでTableTwoの結合カラムを指定しています。
特に何も指定しない場合は、それぞれの主キーが結合カラムになるようです。


これで、結合定義は完了です。

joinの記述

こんな風に記述できます。

List<TableOne> tableOneList = jdbcManager.from(TableOne.class).("tableTwo").getResutList();

ここで重要なのが"tableTwo"という記述。
結合対象はテーブル名ではなく、エンティティで定義しているプロパティ名を指定します。

これで、joinはバッチリ!!・・・のはず。

参考サイト

以下のサイトを参考にさせてもらいました。 感謝。

S2JDBC
公式サイト。ここで基本はバッチリ。ただ結合に関する説明はちょっと不足してる感じ。
S2JDBCでJOINのやり方をいつも忘れるからメモ
結合に関する情報を補完してくれた記事。実際にどう書くかが明記されているので助かりました。
S2JDBCで、結合カラムが複数ある場合のアノテーション
結合カラムに関する説明をしてくれた記事。