EzJDBC(EzJRAP)のcountメソッドの2つの意味!


こんにちは、常々O/RマッパーはSQLを意識させても良いのではないか!と考えているのですが、なかなか理解されない世界に嫌気をさし、空気が読めるEclipseと会話している高橋ですm(__)m


EzJDBC(EzJRAP)では件数を取得するcountメソッドがありますが、このメソッドで取得できる件数には2つの意味が存在します。違いが発生するのはテーブルを結合した場合の件数を取得する場合です。


テーブルを結合して、EzJDBC#relation()メソッドを設定した状態でEzJDBC#count()メソッドを呼び出すとメインテーブルの件数を取得します。


CUSTOMERテーブルとORDERテーブルを結合した場合を例に説明します。

CUSTOMERテーブルとORDERテーブルは「1:n(一対多)」の関係で、CUSTOMERテーブルには100レコード存在し、ORDERテーブルには2000レコード存在したとします。


この場合に下記のコードを実行すると、結果として2000が帰ってきます。

// メインテーブル情報インスタンスを生成
CUSTOMER CUS = new CUSTOMER();
// 結合した結果の件数を取得
long count = EzJDBC.from(CUS).join(CUS.ODR).count();

しかし、以下のコードを実行した場合は、結果として100が帰ってきます。

// メインテーブル情報インスタンスを生成
CUSTOMER CUS = new CUSTOMER();
// 結合した結果の件数を取得
long count = EzJDBC.from(CUS).join(CUS.ODR).relation().count();

EzJDBC#relation()メソッドは、照会結果をfind(Class)メソッドで指定したEntityに格納する際、フラットにセットすいるのではなく、階層としてセットします。
つまり、

List list = EzJDBC.from(CUS).join(CUS.ODR).find(Customer.class);

の場合は、結果として取得できるlistのサイズは2000となり、

List list = EzJDBC.from(CUS).join(CUS.ODR).relation().find(Customer.class);

の場合は、取得できるlistのサイズは100となります。

これと同様にEzJDBC#count()メソッドの場合も、EzJDBC#relation()メソッドの設定有無によって結果が変わる事になります。