[Seasar-user:1221] OracleのDATE型の扱い(ValueType)について

Hikaru Taniguchi taniguchi
2004年 11月 25日 (木) 19:27:02 JST


たにぐちです。

s2-extension絡み(DB)で質問です。
# またまたOracle...です。DATE型関係です。

Beanを使ってOracleに書きにいく場合、型のマッピングはBeanの
プロパティディスクリプタを使っているようです。で、ValueTypesの中身を見
て見ると, java.util.Date 型は TIMESTAMPとして扱われています。

TIMESTAMP型は日付と時刻を含めてサポートできる型で、精度の差(ナノ秒の単
位)こそあれ、java.util.Dateとは行き来できます。実際にこれでデータを書
きこみ、SQL*Plusなどで参照すると日付+時刻情報が格納されています。

問題は次なのですが、SqlReaderなどでデータを読み込む時に、今度は逆の型
マッピング(ResultSetMetaData?から列の型を取得している)を行っているかと
思うのですが、このとき SqlDate というValueTypeが取得されます。

SqlDateType.javaを参照すると

 public Object getValue(ResultSet resultSet, int index) throws SQLException {
	return resultSet.getDate(index);
 }

というようになっていて、最終的に resultSet#getDate()が呼ばれます。JDBC
の仕様(だったはず...)で、getDate()は「日付」のみを返すようになっていま
す。

短絡的には、ValueTypes.java  getValueType()で

  case Types.DATE :
    return getValueType(java.sql.Date.class);

ここを Timestamp.class にすればいいのですが、なんかしっくりきません。
そもそも時刻の値も含むOracle DATE型に対して ResultSetMetaDataが
Types.DATEを返しているのがおかしい、という考え方も普通に出来るので、ス
マートな対処方法があるのかどうか気になっています。

Oracleで開発されている方はどんな対処をされているでしょうか?
  - データベース設計も新規にやってるので DATE型なんて使わずに
    TIMESTAMP型を使っている
  - registerValueType()で上書きして運用
    (staticなのでちょっと怖いですが)

皆様方のお知恵を拝借したく…どうかよろしくお願いします。

--
Hikaru Taniguchi <[E-MAIL ADDRESS DELETED]>



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