[Seasar-user:4071] [S2Dao]Select句のAlias名指定時の挙動について

kubo [E-MAIL ADDRESS DELETED]
2006年 7月 13日 (木) 23:58:26 JST


久保です。

S2Daoの要望です。


例えば、以下のようなBeanを作成して、

[Bean] Book
  テーブル-アノテーション: Book
  プロパティ(DBの列): BookId, BookName, AuthorId
  プロパティ(導出列): BookAuthorName

以下のようなSQL文を実行すると、

select book_id as BookId, book_name as BookName, author_name as BookAuthorName
  from BOOK book
    left outer join AUTHOR author
      on book.author_id = author.author_id

BookId         = 値が取得できない
BookName       = 値が取得できない
BookAuthorName = 値は取得できる

以下のようにすると・・・(as BookId as BookAuthorName を除去)

select book_id, book_name as BookName, author_name
  from BOOK book
    left outer join AUTHOR author
      on book.author_id = author.author_id

BookId         = 値は取得できる
BookName       = 値が取得できない
BookAuthorName = 値は取得できる



AbstractBeanMetaDataResultSetHandler#createRow()を見るに、

A テーブル-アノテーションに定義されている列:
    Select句にはDBの列名(BOOK_IDなど)を指定 → 値取得
    Select句にはプロパティ名(BookIdなど)を指定 → 値は取得されない ★

B テーブル-アノテーションに定義されない列(導出列):
    Select句には'_'つながりの名称(author_name)を指定 → 値取得
    Select句には''なしの名称(AuthorName)を指定 → 値取得

というように処理されています。

★印の部分において、クリティカルな要素ではありませんが、
できれば「値取得」ができるようにお願いしたいです。

経緯としては:
現在のプロジェクトでOrderBy句を動的に変化させて検索しています。
その要素は画面の定義上の'BookId'や'BookName', 'AuthorName'であったりします。
(この定義は別のTeam(会社)より提供されたもので変更ができません)
Select句に 「As BookID」 と指定すれば特に問題なく実現できるだろうと
思ったらできなかった、というのがきっかけです。
そして、外だしSQLを記述する際の「注意点」として、このことを大勢の
開発者(協力会社など)に展開するのもちょっと微妙と思いました。
(「B」はどちらも区別しないが、「A」は気をつけないといけない。
  実際に「値が取得できない」と騒がれた(涙))

これが、S2Daoにおける固定的な仕様というのであれば、仕方ないですが、
もしそうでないというならば、★印の場合でも値取得できるようにして
頂けませんでしょうか?
(他に多くの要望がMLに流れてますので、優先度は低でも構いません)


試しに以下のように修正してうまく動作しております。
また、他のProgramも誤動作なく動いています。


AbstractBeanMetaDataResultSetHandler.createRow()

    if (columnNames.contains(pt.getColumnName())) {
        ValueType valueType = pt.getValueType();
        Object value = valueType.getValue(rs, pt.getColumnName());
        PropertyDesc pd = pt.getPropertyDesc();
        pd.setValue(row, value);
    } else if (!pt.isPersistent()) {

    ↓↓↓

    if (columnNames.contains(pt.getColumnName())) {
        ValueType valueType = pt.getValueType();
        Object value = valueType.getValue(rs, pt.getColumnName());
        PropertyDesc pd = pt.getPropertyDesc();
        pd.setValue(row, value);
    } else if (columnNames.contains(pt.getPropertyName())) {
        ValueType valueType = pt.getValueType();
        Object value = valueType.getValue(rs, pt.getPropertyName());
        ...
    } else if (!pt.isPersistent()) {
        ...



-- 
kubo <[E-MAIL ADDRESS DELETED]>





Seasar-user メーリングリストの案内