@DBFlute, Java, C#, Oracle, DB2 OracleやDB2のCLOBを使った場合の限定的な回避策です。 OracleやDB2の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で」ってポリシーがあるくらいなので、 やはりこういった回避策はちゃんと対応しておかないとということで。