EzJDBCのテーブル結合方法と種類/今更ですが...


こんにちは、最近、6つのRDBMSとたわむれている高橋です。
そんな私が本日ここに各内容は、凝りもせずにEzJDBCの結合についてです。
私が今まで書いてきたEzJDBCを利用したテーブル結合のサンプルソースは以下のようなものでした。


CUSTOMER(CS), ORDERS(OD), ORDER_ITEM(OI)の3テーブルを結合し、結果を取得するEzJDBCのコード

 List list = selects().from(CS).join(OD, OI).find(Customer.class);


上記コードを記述するとEzJDBCはRDBMSに、以下のSQLを発行します。

SELECT
    CS.CODE,
    CS.NAME,
    CS.VERSION,
    OD.ORDER_NO,
    OD.CUSTOMER_CODE,
    OD.CREATED,
    OI.ORDER_NO,
    OI.SEQ
FROM
    CUSTOMER as CS left join
       ORDERS as OD on (CS.CODE=OD.CUSTOMER_CODE) left join
       ORDER_ITEM as OI on (OD.CUSTOMER_CODE=OI.CUTOMER_CODE and OD.NO=OI.ORDER_NO)

Javaのコードでは、テーブルの結合条件を記述していませんが、この理由は以前説明した「2009-10-05 - T.RYoken がんばる日記 / TryGun blog」で事前に設定してあるためです。
このテーブル定義書で設定する結合はER図で設計する基本となる結合を設定することになります。
当然の伊ことですが、実開発では基本の結合条件だけでは足りない実情です。
しかし、新しい結合が出てくるたびにテーブル定義書に結合条件を追記し、コードジェネレーターにテーブル定義書を食わせる。なんてのはフレキシブルじゃない。
でも大丈夫!EzJDBCはテーブル結合条件もタイプ&ネームセーフにコードで実現できてしまうのです。


実際にCUSTOMER(CS), ORDERS(OD), ORDER_ITEM(OI)の3テーブルの結合条件をコードで書いてみましょう。

List list = selects().from(CS)
         .join(OD).on(CS.code.eq(OD.customerCode))
         .join(OI).on(CD.code.eq(OI.customerCode).and(OD.no.eq(OI.orderNo)))
         .find(Customer.class);

コレだけです。
SQLそのままですね。しかし、IDEのコード補完機能が使えますので、ほとんど「Ctrl+space」だけで記述可能になります。
また、タイプ&ネームセーフですので、SQLコードの間違いや、テーブル・列名の間違いは発生しないのです ... ( ̄0 ̄)b
また、結合条件にリテラルを指定することも可能です。


次に結合の種類ですが、EzJDBCでは4種類の結合をサポートしています。
・左外部結合 : left outer join
・右外部結合 : right outer join
・内部結合 : inner join
・全外部結合 : full outer join


通常サンプルで利用している「selects().from(CS).join(OD)」等のjoinメソッドは「左外部結合:left outer join」になります。
以下に各結合条件に対応するEzJDBCのメソッドを記述します。


・左外部結合 : selects().from(CS).join(OD)
・右外部結合 : selects().from(CS).rightJoin(OD)
・内部結合  : selects().from(CS).innerJoin(OD)
・全外部結合 : selects().from(CS).outerJoin(OD)


SQLそのまんまですね。だからこそ簡単に利用可能なのです。
EzJDBCでSQLを記述する本当のメリットは、まだ紹介できませんが、全機能が、今回説明したテーブル結合のようにIDEの補完対象となり、
タイプ&ネームセーフとなるため、簡単にかつ安全にデータの取得を行うことが可能になるのです。


簡単かつ安全なO/RマッパーがEzJDBCなのです....( ̄0 ̄)b