[Seasar-user:2330] 【 S2Dao 】 [ 要望 ] OrderBy の動的生成 ( 埋め込み変数コメント ) について
kubo@buildsystem.jp
jazzflute
2005年 7月 6日 (水) 13:39:06 JST
久保と申します。
Queryアノテーションについて
(的外れなことを言っていたら遠慮なく指摘してください)
以下の場合、SQLにorder byが付加されます。
public String selectList_QUERY = "order by ...";
前提として、EntityManagerは利用しない場合の話です。
自分は、「同じSQLでorder byだけを動的に変える」ということを
やりたかったので、"order by/*$dto.orderByString*/"と設定し、
// 社員マスタを誕生日の降順で検索{条件は...}
...
bean.setXxx(value);
bean.addOrderByDesc(Employee.birthdate_COLUMN);
List resultList = dao.selectList(bean);
というように、検索できるようにしました。
しかし、OrderBy指定が不要な場合もあります。
最初は、OrderBy指定が無しの場合は主キーの昇順でDefaultソートと
考えていましたが、現在のプロジェクトのSQL規約で
「不要なOrderByは付加しない」とあるので(当然と言えば当然か!?)、
やはり、「OrderBy指定が無しの場合はOrderBy句は生成されない」が良いと
思い、以下の様に考えました。
public String selectList_QUERY = "/*BEGIN*/order by/*$dto.orderByString*//*E
ND*/";
しかし、2点問題があります。
1. DaoMetaDataImpl#startsWithOrderBy()がfalseを返し、Where句として
処理されてしまう。
独自(次バージョンよりOverride)のDaoMetaDataImplで、
startsWithOrderBy()判定に"/*BEGIN*/order by"を付け加えることで
解決できます。
2. /*BEGIN*/は、IFコメントを対象とするので、
/*IF dto.orderByString != null*/ このように記述しなければならない。
“1”の解決を"/*BEGIN*//*IF dto.orderByString != null*/order by..."に
すればうまく動作しますが、思いっきりプロパティ名に依存してしまいます。
このやり方で不可能では無いのですが、主義としてあまりS2Dao本体を
改造したくありません。もしよろしければ、「OrderBy句を動的に生成したい」
という要望として対応して頂けませんでしょうか?
# 自分の考えられる限りでは、埋め込み変数コメント用の/*BEGIN*/
# を追加することで解決できるのではないかと考えています。
# (既存のBEGINの仕様を変更すると影響が大きいと考えられるため)
# [埋め込み変数コメント用の/*BEGIN*/]をどう表現するかは
# ちょっと思いつきません。
#
# /*BEGIN*/で囲われた中に存在する「全ての埋め込み変数コメントの値がnull」
# の場合、/*BEGIN*/で囲われた中は評価されない。
# そして、startsWithOrderBy()で、"/*BEGIN*/order by"でtrueを返す。
#
#
# 但し、解決されれば対応策はなんでも構いません。
Seasar-user メーリングリストの案内