EzJDBCで仮想テーブル情報クラスを作る意味


EzJDBCでは「仮想テーブル情報クラス」を簡単に作成する事が出来ます。

通常テーブルは正規化されますので、トランザクションテーブルとマスタテーブルに分類されます。

例えば、注文(ORDER)テーブルと顧客(CUSTOMER)テーブルがあった場合、注文テーブルには顧客IDの項目はありますが、顧客名称などの情報は顧客テーブルで管理されます。


この場合、注文テーブルを照会する場合は、ほぼ間違いなく顧客名称を必要とするシステムだったとすると、注文テーブルを照会する際には必ず顧客テーブルと結合(JOIN)する必要が出てきます。
EzJDBCの場合であれば以下のソースを毎回記述する事になります。

ORDER ORD = new ORDER();
Order order = EzJDBC.from(ORD).join(ORD.CUS).findSingle(Order.class);

なにか面倒です><
しかも、通常は顧客(CUSTOMER)テーブルから必要とするのは、顧客名称と電話番号だけだったとすると下記のように記述します。

ORDER ORD = new ORDER();
Order order = EzJDBC.from(ORD).join(ORD.CUS).includes(ORD.ALL, ORD.CUS.NAME, ORD.CUS.TEL).findSingle(Order.class);

もっと面倒です><


そんな時に便利なのが「仮想テーブル情報クラス」になります。
仮想テーブル情報クラスを作成することにより、上記の問題が解決します。
具体的な方法はいくつかありますが、もっとも単純な方法として結合元(ORDER)テーブル情報クラスを拡張する方法があります。
今回は、注文テーブルに顧客マスタの一部の情報を付加したいので、注文(ORDER)テーブル情報クラスを拡張します。


拡張方法は簡単です。まず、注文テーブルの情報クラス「ORDER」を継承したクラス「ORDER_ADDED」を作成します。継承したクラスに、追加したい項目情報プロパティを設定します。
コンストラクタで、ORDERとCUSTOMERの結合条件を設定し、追加したプロパティに項目情報を設定します。
最後にsuperクラスであるEzTableInfoのaddField(EzColumnInfo)とjoin(EzTableInfo)メソッドを呼び出します。注意:クラス名は任意ですので、自由につけて下さい。

/** ORDERテーブルにCUSTOMERテーブルの一部の項目情報を
  付加した仮想テーブル情報クラス */

public class ORDER_ADDED extends ORDER {

   // ORDER情報に付加したいCUSTOMERテーブルの顧客名称と電話番号を設定します。
   /** 顧客名称 */
   public StringType CUSTOMER_NAME;
   /** 顧客電話番号 */
   public StringType CUSTOMER_TEL;

   /** コンストラクタ */
   public ORDER_ADDED() {
      // super(テーブル別名)
      super("ORA");
      // 結合テーブル(CUSTOMER)情報を生成
      CUSTOMER CUS = new CUSTOMER("CUS",ORD);
      // ORDERとCUSTOMERの結合条件設定
      CUS.condition(this.CUSTOMER_ID.eq(CUS.ID));
      // CUSTOMERテーブルの顧客名称を設定
      this.CUSTOMER_NAME= CUS.NAME;
      // CUSTOMERテーブルの電話番号を設定
      this.CUSTOMER_TEL = CUS.TEL;
      // 設定した項目を追加します。
      super.addField(this.CUSTOMER_NAME, this.CUSTOMER_TEL);
      // 結合テーブル(CUSTOMER)を設定します。
      super.join(CUS);
   }
}

このクラスを利用すると、先ほど説明した下記のソースが

ORDER ORD = new ORDER();
Order order = EzJDBC.from(ORD).join(ORD.CUS).includes(ORD.ALL, ORD.CUS.NAME, ORD.CUS.TEL).findSingle(Order.class);

こうなります

ORDER_ADDED ODA = new ORDER_ADDED();
Order order = EzJDBC.from(ODA).findSingle(Order.class);

ずいぶん、すっきりしましたね(^^)
顧客名称にアクセスする場合は「order.customer.name」、顧客電話番号にアクセスする場合は「order.customer.tel」でokです。


またORDER_ADDEDを他のテーブルと結合することも可能です(^^)v