EzJDBCで「GROUP BY」始めました(^^)


本日はEzJDBCで「GROUP BY」する方法について説明したいと思います。

ORDERテーブルとORDER_ITEMORDERを結合し、お客様ID毎の請求合計額を求める場合を例に説明いたします。

// ORDERテーブル情報インスタンス生成
ORDER OD = new ORDER();
// ORDERとORDER_ITEMを結合し、お客様ID毎の請求金額の照会
List list = EzJDBC.selects(OD.customerId, OD.CS.name, OD.OI.amount.sum())
                   .from(OD.OI).join(OD.CS) 
                   .groupBy(OD.customerId, OD.CS.name)
                   .find(Order.class);

見たまんまですね、簡単でしょ...(^^)
EzJDBC#selectsソッドに選択項目を設定し、EzJDBC#groupByメソッドで集約項目を設定するだけです。


ネイティブSQLと異なる箇所は集計関数の箇所だけです。ネイティブSQLであれば「sum(OD.OI.amount)」とするところが「OD.OI.amount.sum()」とします。
static importを利用して「EzJDBC.selects(sum(OD.OI.amount))...」とする事は可能でしたが、static importを強要するぐらいであれば「OD.OI.amount.sum()」は許容範囲かなと思い、この形にしました。


また、集約項目(groupByで指定する項目)とSELECT項目が同じであった場合は、groupByメソッドの引数は省略できます。groupByメソッドの引数を省略した場合は、selects(又はselect)メソッドで設定した項目が集約項目として扱われます。
この時、selectsメソッドで設定した項目で集計関数メソッド(sum()等)が呼び出されている項目は、集約項目から除外されます。

List list = EzJDBC.selects(OD.customerId, OD.CS.name, OD.OI.amount.sum())
                   .from(OD.OI).join(OD.CS) 
                   .groupBy()
                   .find(Order.class);

EzJDBCで利用できる集計関数は以下の5つです。

集計関数 メソッド 意味
AVG TableColumn#avg() 平均値
COUNT TableColumn#count() 個数
MIN TableColumn#min() 最小値
MAX TableColumn#max() 最大値
SUM TableColumn#sum() 合計値