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