This is a cache of http://dbflute.seasar.org/ja/manual/function/ormapper/conditionbean/query/orderby/specifiedderivedorderby.html. It is a snapshot of the page at 2024-11-13T00:29:20.221+0000.
SpecifiedDerivedOrderBy | DBFlute

SpecifiedDerivedOrderBy

概要

基本概念

子テーブルの導出カラムでソートします。

(Specify)DerivedReferrer と必ずセットで利用します。

会話上では、すぺしふぁいどでぃらいぶどおーだーばい と表現します。ややこしいので、DerivedReferrer の OrderBy と表現することもあります。

実装方法

実装の流れ

まずは、(Specify)DerivedReferrer を実装して、その後 query() に続いて addSpecifiedDerivedOrderBy_[Asc/Desc]() を呼び出して、DerivedReferrer で使った導出カラムのエリアス名を引数に指定します。

e.g. 子テーブルの導出カラムで並べる実装手順 (Eclipseでコード補完) {BIRTHDATE} @Java
MemberCB cb = new MemberCB();
cb.specify().derivedMemberLoginList().max(new SubQuery<MemberLoginCB>() {
    public void query(MemberLoginCB subCB) {
        subCB.specify().columnLoginDatetime(); // 導出カラムの指定
        subCB.query().setMobileLoginFlg_Equal_False(); // 絞り込み条件
    }
}, Member.ALIAS_latestLoginDatetime);
cb.query().addSD // .addSD まで打って Asc か Desc を選択
--
cb.query().addSpecifiedDerivedOrderBy_Desc(Member.ALIAS_latestLoginDatetime);

親テーブルの子テーブル

親テーブルの子テーブルの導出カラムも、最終的には基点テーブルのカラムと同レベルのカラムと扱われているため、特に変わらず基点テーブルの Query に対してソートを指定します。

e.g. 親テーブルの子テーブルの導出カラムで並べる実装手順 (Eclipseでコード補完) {BIRTHDATE} @Java
MemberCB cb = new MemberCB();
cb.specify().specifyMemberStatus().derivedMemberLoginList().max(new SubQuery<MemberLoginCB>() {
    public void query(MemberLoginCB subCB) {
        subCB.specify().columnLoginDatetime(); // 導出カラムの指定
        subCB.query().setMobileLoginFlg_Equal_False(); // 絞り込み条件
    }
}, Member.ALIAS_latestLoginDatetime);
cb.query().addSpecifiedDerivedOrderBy_Desc(Member.ALIAS_latestLoginDatetime);

Query(Relation) で親テーブルの Query にて指定しても動作します。特に違いはありません。

NullsFirst/Last の活用

導出カラムは関数の仕様として、データ存在しない場合に null になるケースが想定されますので、DerivedReferrerOption で coalesce を利用していない場合は、NullsFirst/Last が必要になる場面が多いと想定されます。

e.g. 最終ログイン日時の昇順で、ログインしたことない人を後に並べる @Java
...
cb.query().addSpecifiedDerivedOrderBy_Asc(Member.ALIAS_latest...).withNullsLast();

メソッド仕様

エリアス名は必須

エリアス名は必須です。

必ず DerivedReferrer の後に

(Specify)DerivedReferrer の処理の後で呼び出される必要があります。