[Seasar-user:20269] Re: [DBFlute]OracleでDATE型カラムのインデックスが利用されない

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2010年 10月 21日 (木) 23:00:39 JST


小林 (koichik) です.

Date:    Thu, 21 Oct 2010 20:52:00 +0900
From:    kubo <[E-MAIL ADDRESS DELETED]>
To:      [E-MAIL ADDRESS DELETED]
Subject: [Seasar-user:20268] Re: [DBFlute]OracleでDATE型カラムのインデックスが利用されない

> なるほど、そもそもDBMSに依存しないJDBCの型の中で、
> Oracle の DATE 型をぴったし当てはめられる型が存在しない
> というところですかね。

そうですね.
JDBC および標準 SQL には日時 (日付と時刻) を
扱うデータ型が基本的に TIMESTAMP 1 種類
(TZ 等は精度と同じ扱いとして) しかないのに対し,
Oracle には DATE と TIMESTAMP の 2 種類があり,
どちらも java.sql.Timestamp にマッピングするのが
問題の根本でしょうね.
歴史的なものなのでしょうがないですけど.

> DATE型カラムのメタデータが:
>   ojdbc5.jar = java.sql.Types.DATE
>   ojdbc6.jar = java.sql.Types.TIMESTAMP
> となっていたので TIMESTAMP の指定で問題ないかなと
> 思ったのですが、(実際検索の動きとしては問題ないですが)
> 内部的には型違いと。

Oracle の DATE が java.sql.Types.DATE なのは
単純に間違ってますよね.
Oracle の DATE は日付型ではなく日時型なので.
ただし,Oracle の日時型には 2 種類ある...

> > Oracle JDBC ドライバには oracle.sql.DATE という
> > 型があるので、java.sql.Timestamp からこの型に
> > 変換して、OraclePreparedStatement#setDATE() に
> > 渡すなんてのが Oracle 的に好ましいやり方なのかも。
> 
> O/Rマッパには厳しい話ですね。。。
> いっそリフレクションでガツンってのは
> やはり無理矢理過ぎるかなぁ。

リフレクションでガツンとは?


S2JDBC でも同じ問題は起こり得るので
何か考えた方がいいかなぁ.
幸い (?),S2JDBC では

@Temporal(TemporalType.TIMESTAMP)
public java.util.Date xxx;

public java.sql.Timestamp xxx;

という 2 種類の書き方ができるので,前者の場合は
DATE,後者の場合は TIMESTAMP にマップして,
前者は OracleDialect で oracle.sql.DATE に
変換するとか.
S2JDBC-Gen と辻褄合うのかなぁ...


-- 
<component name="koichik">
    <property name="fullName">"Koichi Kobayashi"</property>
    <property name="email">"[E-MAIL ADDRESS DELETED]"</property>
    <property name="blog">"http://d.hatena.ne.jp/koichik"</property>
    <property name="twitter">"http://twitter.com/koichik"</property>
</component>



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