DBFlute: 0.9.3 リリース

@DBFlute, Java
今回のリリースで解決した課題

ほとんどが、Oracleの環境的なものですね。。。
(CLOBのやつはDB2にも関連)
ただ、そういうガッチリしたシステムでも難なく使えるように
なったといことでとてもよいレベルアップができたと思います。

DBFlute-0.9.2から0.9.3への移行時の注意

CLOBのUnion不可問題の回避策(MyselfInScopeSubQuery)

@DBFlute, Java, C#, Oracle, DB2
OracleやDB2のCLOBを使った場合の限定的な回避策です。
OracleDB2のCLOBがSelect句に指定されている状態では
Unionができません。これはDBMSの仕様のようです。
UnionAllは大丈夫です。重複消しをしないからだと思います。

で、はい、そうですかと退散はできないので、今回対応しました。
(無論、外だしSQLにしてなんかしら工夫すれば今までも回避可能です)
MemberCB cb = new MemberCB();
cb.query().myselfInScope(new SubQuery<MemberCB>() {
    public void query(MemberCB subCB) {
        subCB.query().setMemberName_PrefixSearch("S");
        subCB.union(new UnionQuery<MemberCB>() {
            public void query(MemberCB unionCB) {
                unionCB.query().setMemberStatusCode_Equal_Formalized();
            }
        });
    }
});
cb.query().addOrderBy_Birthdate_Desc();
Unionの処理を「自分自身を表現するサブクエリ」に持っていきます。
で、そのサブクエリで絞り込まれた結果でCLOBカラムを取得します。
(CLOBのUnionによるDBMS制限例外の回避)
検索結果的には、メインクエリでやろうがサブクエリでやろうが、
何も変わらないため、本当にこの場面で使う機能です。
こういうのがあるってことだけ覚えておいて、いざ必要になったら
その機能を探して使うってくらいで良いかと思います。
(本当にごく稀だと思うので)

敢えて言うなら、CLOBを使わないときでも、
Union時の重複消し処理のパフォーマンスをちょっと上げるかも
しれません。サブクエリではPKだけで重複消し処理を行うためです。

ConditionBeanには「OrはUnionで」ってポリシーがあるくらいなので、
やはりこういった回避策はちゃんと対応しておかないとということで。

OracleのSequenceを自動Drop

@DBFlute, Java, C#, Oracle
DBFlute-0.9.2から0.9.3への移行時の注意
に書いてありますが、ReplaceSchemaの最初の初期化処理にて、
OracleのSequenceも自動Dropするようにしました。
今まで、

SequenceだけはDrop文を明示的に書いてて、
最初の一回の実行時は、(処理は続行されるけども)
そのDropが例外になって紛らわしかった

のですが、それがなくなります。
今、明示的に書いてるSequenceのDrop文は削除して構いません。