Uploaded image for project: 'S2Dao'
  1. S2Dao
  2. DAO-26

[Seasar-user:4071] SELECT句のASへBeanのプロパティ名を指定した場合にもBeanへセットして欲しい

XMLWordPrintable

    • Type: Icon: New Feature New Feature
    • Resolution: Fixed
    • Priority: Icon: Major Major
    • 1.0.36
    • Affects Version/s: 1.0.35
    • Component/s: s2dao
    • None

      例えば、以下のような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()) {
              ...
      

            Assignee:
            manhole manhole
            Reporter:
            manhole manhole
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

              Created:
              Updated:
              Resolved: