[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 メーリングリストの案内