EzJDBCでJOIN結果をEntityの親子関係にセットする方法!


今回はEzJDBCでテーブル結合した結果をリレーション形式で取得する方法について説明したいと思います。


リレーション形式って...( ̄口 ̄|||)と引かれている方も多いでしょうが、要は、JOINしたテーブルの照会結果をフラットに取得するか!

Entityの親子関係を利用して取得するかの違いです。。。


以下に親子関係のある「お客様テーブル」と「注文テーブル」に対応するEntityソースを記述しました。

親子の関係は、「お客様テーブル:注文テーブル=1:n」の関係です。

いわゆる一対多の関係ですね。。。

 /** お客様情報 */
 public class Customer {
   /* TRYGEN_SOURCE_REPLACE_BEGIN */
   /** ID */
   public int id;
   /** 住所 */
   public String address;
      ...

   /** バージョン */
   public int version;

   /** お客様の注文情報リスト */
   public List orderList;
   /* TRYGEN_SOURCE_REPLACE_FINAL */

   /** 開発者が追加した注文番号 */
   public int orderNo;
 }

 /** 注文情報 */
 public class Order {
   /** 注文番号 */
   public int orderNo;
   /** 注文日 */
   public Date orderDate;
   /** お客様ID */
   public int customerId;
      ...

   /** バージョン */
   public int version;
 }

下記に「お客様テーブル」と「注文テーブル」を結合し、お客様テーブルのPKであるIDを抽出条件として指定した場合のEzJDBCのソースを記述します。

 // メインテーブルとなるお客様テーブル情報インスタンスを生成
 CUSTOMER _CS = new CUSTOMER();
 // お客様と注文情報を結合し照会します。
 List list = EzJDBC.from(_CS._OD).where(_CS.ID.eq(1)).find(Customer.class);

仮に”お客様ID”が「1」のお客様の注文が3件(001,002,003)あった場合は、」上記結果(list内のCustomerの数)は3になります。

そして、開発者が追加したCustomer#orderNoには、それぞれ001,002,003がセットされます。

つまり、テーブルを照会した結果と同じフラットな状態で結果がセットされることになります。


しかし、上記ソースに1メソッド追加すると階層関係で結果が取得できるようになります。

 // メインテーブルとなるお客様テーブル情報インスタンスを生成
 CUSTOMER _CS = new CUSTOMER();
 // お客様と注文情報を結合し照会します。
 List list = EzJDBC.from(_CS._OD).where(_CS.ID.eq(1)).relation().find(Customer.class);

上記の様にEzJDBC#relation()メソッドを呼び出すと、結果(list内のCustomerの数)は1になります。

そして、Customer#orderList内にOrderオブジェクトが3件格納されます。


やばし!かんたんすぎて引く...( ̄  ̄|||)