В настоящее время я борюсь с проблемой преобразования Oracle SQL DATE с помощью iBATIS из Java.
Я использую тонкий драйвер Oracle JDBC ojdbc14 версии 10.2.0.4.0. iBATIS версия 2.3.2. Java 1.6.0_10-rc2-b32.
Проблема вращается вокруг столбца типа DATE, возвращаемого этим фрагментом SQL:
SELECT *
FROM TABLE(pk_invoice_qry.get_contract_rate(?,?,?,?,?,?,?,?,?,?)) order by from_date
Вызов процедуры пакета возвращает курсор ref, который обертывается в TABLE, где легко читается набор результатов, как если бы это был запрос выбора к таблице.
В PL/SQL Developer один из возвращаемых столбцов, FROM_DATE, типа SQL DATE, имеет точность до времени суток:
Tue Dec 16 23:59:00 PST 2008
Но когда я получаю доступ к этому через iBATIS и JDBC, значение сохраняет только точность до дня:
Tue Dec 16 12:00:00 AM PST 2008
Это становится яснее, когда отображается так:
Должно быть:
1229500740000 milliseconds since epoch
Tuesday, December 16, 2008 11:59:00 PM PST
Но вместо этого получим:
1229414400000 milliseconds since epoch
Tuesday, December 16, 2008 12:00:00 AM PST
(as instance of class java.sql.Date)
Независимо от того, что я пытаюсь, я не могу показать полную точность этого столбца DATE, который будет возвращен через Java JDBC и iBATIS.
То, что iBATIS отображает, таково:
FROM_DATE : 2008-12-03 : class java.sql.Date
Текущее отображение iBATIS:
<result property="from_date" jdbcType="DATE" javaType="java.sql.Date"/>
Я также пробовал:
<result property="from_date" jdbcType="DATETIME" javaType="java.sql.Date"/>
или
<result property="from_date" jdbcType="TIMESTAMP" javaType="java.sql.Timestamp"/>
Но все попытки сопоставления дают одно и то же усеченное значение даты. Как будто JDBC уже наносил ущерб потери точности данных, прежде чем iBATIS даже коснется его.
Ясно, что я теряю некоторые из своих данных, просматривая JDBC и iBATIS, чего не происходит, когда я остаюсь в PL/SQL Developer с тем же фрагментом SQL в качестве теста script. Неприемлемый вообще, очень расстраивающий, и в конечном счете очень страшный.