ORDERアノテーションが使えないのはナゼ?

というわけで再びソースを追っかける。
出発点はテストメソッドでインジェクションされたDAOを使うところである。

List belongToList = belongToDao.getAllEntity();

ここにブレイクポイントをはり、ステップインで追いかける。
するとS2DaoInterceptor.invoke(MethodInvocation)に飛んできた。
そこでは

  • belongToDaoの定義がインターフェースかどうかを見る
  • インターフェースならそのインターフェースを元にDaoMetaDataというモノを作る
  • DaoMetaDataからSqlCommandを取得して実行する

という処理が行なわれているようだ。

DaoMetaData dmd = daoMetaDataFactory_.getDaoMetaData(targetClass);
SqlCommand cmd = dmd.getSqlCommand(method.getName());
Object ret = cmd.execute(invocation.getArguments());

ということはDaoMetaData dmdを作成した時点でSQL文は出来上がっていると推測される。
ならばdmdの生成過程を追いかければわかりそうだ。
上記の通り、dmdはdaoMetaDataFactoryのgetDaoMetaData(targetClass)で取得している。

そこで、まずdaoMetaDataFactoryはナニモノかを調べる。
daoMetaDataFactoryはdao.dicon内の

<component class="org.seasar.dao.impl.DaoMetaDataFactoryImpl"/>

からS2Containerが自動で作成したDaoMetaDataFactoryインターフェースをimplementしたオブジェクトインタンスである。

ふむふむ、なるほど。
じゃあ、このgetDaoMetaData(targetClass)はナニをしているを調べよう。
ソースを見ると

  • クラス名をキーにして(クラスで持っている)キャッシュ用のマップからdaoMetaDataを取得しようとする
  • 取れればそれをそのまま返す
  • 取れなければ新規に作成してキャッシュに放り込んだ上で作成したものを返す

という処理を行なっている。

dmd = new DaoMetaDataImpl(daoClass, dataSource_, statementFactory_, resultSetFactory_);

と、いうことはこのDaoMetaDataImplのコンストラクタは何をしているかを調べればわかりそうだ。
すると

annotationReader_ = new FieldAnnotationReader(daoBeanDesc_);
・・・(中略)・・・
setupSqlCommand();

という処理が書かれている。
このFieldAnnotationReaderを調べると、アノテーションのsuffix文字が定義されていた。
その中にはQUERYはあったがORDERはなかった。
更にsetSqlCommand()の中でtargetClassのメソッド名の一覧を取得して、それぞれに対しannotationReaderとつき合わせてsqlを組み上げていた。
ということは、FieldAnnotationReaderにはORDERアノテーションに対する定義がないので、ORDERアノテーションが使えないわけだ。

なるほどね〜。ようやくわかりました。
ってもうこんな時間かい( ̄□ ̄;)!!