This is a cache of http://dbflute.seasar.org/ja/manual/function/ormapper/behavior/select/selectcount.html. It is a snapshot of the page at 2024-11-13T00:25:41.465+0000.
selectCount(cb) | DBFlute

selectCount(cb)

概要

基本概念

ConditionBeanをもとにカウント検索 (select count(*))をします。

ページング条件が設定されていても、ページング条件を無視したカウントを取得します。 また、必ず該当テーブルのユニークなカウントを取得します。例えば、PKの存在するテーブルであれば、count(*) の "*" の中には必ず PK カラムが含まれます。PKなしテーブルであれば、"*" には (SpecifyColumnの有無に関わらず) 全てのカラムが含まれます。

会話上では、せれくとかうんと と表現します。文脈上、抽象的で伝わりにくい場合は Behaviorのせれくとかうんと(メソッド)ConditionBeanのせれくとかうんと などと言うとわかりやすいでしょう。

実装方法

実装の流れ ※1.1.x (Java8版)

Behaviorの selectCount() を呼び出し、ConditionBeanを指定します。

e.g. selectCount()の実装手順 (Eclipseでコード補完) {MEMBER} @Java
memberBhv.selCo // .selCo と打って enter
--

// メソッドが補完されて、引数の "cbLambda" が選択状態に
memberBhv.selectCount(cbLambda)
--

// _ll で補完 (DBFlute補完テンプレートが有効なら)
memberBhv.selectCount(_ll)
--

// Lambda引数名はcbにして...
memberBhv.selectCount(cb -> {
    cb.query().set... // tabでカーソル移動してcbで検索条件
})
--

// セミコロン ';' を打って ctrl+2, L で戻り値補完
int count = memberBhv.selectCount(cb -> {
    cb.query().set...
});

実装の流れ ※1.0.x (Java6版)

1.0.x (Java6版) であれば...

e.g. selectCount()の実装手順 (Eclipseでコード補完) {MEMBER} @Java
memberBhv.selCo // .selCo と打って enter
--
// セミコロン ';' を打って ctrl+2, L
memberBhv.selectCount(cb);
--
int count = memberBhv.selectCount(cb);

メソッド仕様

引数

該当のBehaviorに対応するテーブルのConditionBeanとなります。(1.1.xよりコールバック)

ConditionBeanが必ず存在することが前提であるため、nullを指定した場合は例外発生します。 検索条件がない検索をする場合でも、必ずConditionBeanのインスタンスが必要です。

設定されている SetupSelect や OrderBy, SpecifyColumn(旧バージョンにて例外あり) など、カウント検索に不要な情報は無視されます。

戻り値

int型となります。検索結果が一件もない場合は 0 が戻ります。

int型(32ビット:2147483648)の精度を超える件数は、サポートされません。

オーバーライド

selectList() と同じような要領となります。

UnionQuery での select 句のカラム

PKが存在するテーブルの場合で、引数の ConditionBean で UnionQuery を利用すると、UnionQuery に対応する select 句は PK カラムのみ列挙されます(PK は NotNull なのでカウントに変化なし)。 つまり、CLOB や text 型のカラムが含まれるテーブルで、union の distinct 処理でそれらカラムがサポートされない DBMS でも問題なく UnionQuery を利用することができます(@since 0.9.7.7)。 旧バージョンでは、SpecifyColumn を利用して列挙カラムを絞り込むことで回避することができます。

PKなしテーブル(ビューも含む)では、バージョンに関わらず回避はできません。ビューにおいては、AdditionalPrimaryKey で疑似の PK を設定すると良いでしょう。