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