- 浏览: 35350 次
- 性别:
- 来自: 天津
最新评论
Oracle10g JDBC ojdbc14 DATE类型hibernate查询时分秒问题(纠结困扰了半天,汗)
一般的数据库中,DATE字段仅仅表示日期,不包括日期信息,而Oracle数据库中的DATE数据类型是包括日期、时间的,对于不同的Oracle jdbc驱动版本,对于该问题的处理都有些区别。
最近我从sql server2000 换到 ORACLE 10G,时间字段因需求,设为了DATE类型,发现hibernate用native SQL 查询,显示不了时分秒,一看,原来是JDBC驱动自动把date映射为 java.sql.date,故截断了时分秒信息,如果你使用9i或者11g
的驱动程序,此问题不存在,但是Oracle10g的JDBC驱动,问题就来了,你会发现时间不见了!!!
网上看了资料,在oracle 官网Oracle JDBC FAQ 看到:
http://www.oracle.com/technology/tech/java/sqlj_jdbc/htdocs/jdbc_faq.html#08_01
引用
Simple Data Types
What is going on with DATE and TIMESTAMP?
This section is on simple data types. :-)
Prior to 9.2, the Oracle JDBC drivers mapped the DATE SQL type to java.sql.Timestamp. This made a certain amount of sense because the Oracle DATE SQL type contains both date and time information as does java.sql.Timestamp. The more obvious mapping to java.sql.Date was somewhat problematic as java.sql.Date does not include time information. It was also the case that the RDBMS did not support the TIMESTAMP SQL type, so there was no problem with mapping DATE to Timestamp.
In 9.2 TIMESTAMP support was added to the RDBMS. The difference between DATE and TIMESTAMP is that TIMESTAMP includes nanoseconds and DATE does not. So, beginning in 9.2, DATE is mapped to Date and TIMESTAMP is mapped to Timestamp. Unfortunately if you were relying on DATE values to contain time information, there is a problem.
There are several ways to address this problem in the 9.2 through 10.2 drivers:
Alter your tables to use TIMESTAMP instead of DATE. This is probably rarely possible, but it is the best solution when it is.
Alter your application to use defineColumnType to define the columns as TIMESTAMP rather than DATE. There are problems with this because you really don't want to use defineColumnType unless you have to (see What is defineColumnType and when should I use it?).
Alter you application to use getTimestamp rather than getObject. This is a good solution when possible, however many applications contain generic code that relies on getObject, so it isn't always possible.
Set the V8Compatible connection property. This tells the JDBC drivers to use the old mapping rather than the new one. You can set this flag either as a connection property or a system property. You set the connection property by adding it to the java.util.Properties object passed to DriverManager.getConnection or to OracleDataSource.setConnectionProperties. You set the system property by including a -D option in your java command line.
java -Doracle.jdbc.V8Compatible="true" MyApp
Oracle JDBC 11.1 fixes this problem. Beginning with this release the driver maps SQL DATE columns to java.sql.Timestamp by default. There is no need to set V8Compatible to get the correct mapping. V8Compatible is strongly deprecated. You should not use it at all. If you do set it to true it won't hurt anything, but you should stop using it.
Although it was rarely used that way, V8Compatible existed not to fix the DATE to Date issue but to support compatibility with 8i databases. 8i (and older) databases did not support the TIMESTAMP type. Setting V8Compatible not only caused SQL DATE to be mapped to Timestamp when read from the database, it also caused all Timestamps to be converted to SQL DATE when written to the database. Since 8i is desupported, the 11.1 JDBC drivers do not support this compatibility mode. For this reason V8Compatible is desupported.
As mentioned above, the 11.1 drivers by default convert SQL DATE to Timestamp when reading from the database. This always was the right thing to do and the change in 9i was a mistake. The 11.1 drivers have reverted to the correct behavior. Even if you didn't set V8Compatible in your application you shouldn't see any difference in behavior in most cases. You may notice a difference if you use getObject to read a DATE column. The result will be a Timestamp rather than a Date. Since Timestamp is a subclass of Date this generally isn't a problem. Where you might notice a difference is if you relied on the conversion from DATE to Date to truncate the time component or if you do toString on the value. Otherwise the change should be transparent.
If for some reason your app is very sensitive to this change and you simply must have the 9i-10g behavior, there is a connection property you can set. Set mapDateToTimestamp to false and the driver will revert to the default 9i-10g behavior and map DATE to Date.
故用此方法:
- public static void main(String[] args) {
- try {
- Class.forName("oracle.jdbc.OracleDriver");
- Properties prop=new Properties();
- prop.setProperty("user","system");
- prop.setProperty("password","dba");
- prop.setProperty("oracle.jdbc.V8Compatible","true");
- java.sql.Connection connection1 = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl", prop);
- System.out.println(connection1);
- System.out.println(connection1.getMetaData().getDriverName()+" "+connection1.getMetaData().getDriverVersion());
- ResultSet rs = connection1.createStatement().executeQuery("select date1,date2 from t_test");
- while (rs.next()) {
- String value1 = rs.getString("DATE1");
- System.out.println("DATE1=" + value1);
- String value2 = rs.getString("DATE2");
- System.out.println("DATE2=" + value2);
- }
- }
- catch (Exception exception1) {
- exception1.printStackTrace();
- }
- }
可以解决!!!
在 hibernate中,在hibernate.cfg.xml中加入:
一样也可以解决
网上看了一下,好像以下版本的 jdbc 存在问题
引用
Driver Result
with classes12.zip at C:\Oracle\Ora81\jdbc\lib, Oracle JDBC Drivers release 8.1.6 OK, no problem found
with "oracle 8.1.7 driver\classes12.zip", oracle 8.1.7 driver OK, no problem found
with "oracle 10i\classes12.jar", oracle 10i driver ID corrputed. Bug
with "oracle9i driver\classes12.jar", oracle 9i driver ID corrputed. Bug
with "oracle 10i\ojdbc14.jar", oracle 10i driver ID corrputed. Bug
with "oracle9i driver\ojdbc14.jar", oracle 9i driver ID corrputed. Bug
最好还是把 date 的在 数据库中设为 timestamp 类型。。。。
发表评论
-
JDK,JRE,JVM区别与联系
2014-08-14 19:23 651很多朋友可能跟我一 ... -
ORA-01578(数据块损坏)错误解决方法
2012-08-17 16:30 2173错误:在 exp 时出现以下错误: EXP-00056: 遇 ... -
oracle 只有数据文件时的恢复
2012-08-17 15:26 2686兄弟刚用ORACLE,因为IP地址变了下,玩了半天, ... -
ORACLE中NOT IN 的替代
2012-08-07 14:01 985典型的查询方式为:SELECT TITLEFROM BO ... -
eclipse正则表达式批量查找替换
2012-07-26 13:50 1357我们经常使用一些工具进行替换操作,有些工具在替换时支持使用正则 ... -
删除Oracle中奇怪的表名称BIN$…的方法
2012-04-02 17:07 1062从Oracle10g开始删除数据库表的时候并不是真正删除 ... -
oracle添加列到指定位置
2012-04-02 16:29 2816oracle中,1.如果表已经装载了大量数据应该是用视图 ... -
oracle hibernate 临时表 存储过程
2012-03-23 10:19 1612参考资料 1 ORACLE 存储 ... -
java好的编码习惯
2012-03-11 09:49 884最近的机器内存又爆 ... -
存储过程还是业务逻辑层
2012-02-25 20:55 12831.存储过程是基于计算密集型的业务逻辑。如果是基于操作密集型的 ... -
连接oracle 报 ORA-12519
2012-02-24 13:20 2575TNS-12519与processes参 ... -
HashMap原理
2012-01-13 10:46 1062Hashmap是一种非常常用的、应用广泛的数据类型,最近研究到 ... -
oracle no appropriate service handler found ORA-12519
2012-01-11 11:14 973今天下午,开发人员突然说不能连接数据库了,提示相关的 ... -
hibernate.jdbc.fetch_size 和 hibernate.jdbc.batch_size
2012-01-10 16:44 1004hibernate.jdbc.fetch_size 和 h ... -
struts2 标签 <s:set> <s:if>
2011-12-23 10:40 1272Struts2中s:set标签和s:if标 ... -
spring中集成测试
2011-11-18 10:13 787详细讲解在Spring中进行集成测试 ... -
java 学习之路
2011-09-17 12:57 635《ThinkinginJava》。它是 ... -
spring 配置连接池
2011-09-17 12:57 1189不管通过何种持久化技术,都必须通过数据连接访问数据库,在 ... -
jvm 内存分布
2011-09-17 12:55 921一、JVM简介 JVM是Java Virtual ... -
java 内部类的应用场景
2011-09-17 12:54 894幕后英雄的用 ...
相关推荐
Java与Oracle数据库交互时,需要注意一些特性,比如PL/SQL块、游标、BLOB/CLOB等大对象处理,以及Oracle特有的数据类型如DATE、TIMESTAMP等。 在实际开发中,为了更好的管理数据库连接,通常会使用连接池,如Apache...
1. **添加数据库驱动**:首先,将数据库驱动(如Oracle的ojdbc14.jar)放入Tomcat服务器的common\lib目录下,以便服务器能够识别并连接到数据库。 2. **修改配置文件**:接着,需要编辑Tomcat的配置文件conf\server...
1. **JDBC驱动**:Oracle提供特定的JDBC驱动(如ojdbc),使得Java应用程序能够连接到Oracle数据库。 2. **连接数据库**:使用`DriverManager.getConnection()`方法,传入数据库URL、用户名和密码来建立连接。 3. **...
1. **ojdbc14.jar**:这是Oracle数据库的JDBC驱动包,它允许Java程序连接到Oracle数据库,执行SQL语句,进行数据操作。使用此驱动,开发者可以构建数据访问层,实现与Oracle数据库的无缝交互。 2. **dom4j-1.6.jar*...
iOS版微信抢红包Tweak.zip小程序
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过严格测试运行成功才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
基于springboot社区停车信息管理系统.zip
基于springboot南皮站化验室管理系统源码数据库文档.zip
## 数据指标说明 全要素生产率(TFP)也可以称之为系统生产率。指生产单位(主要为企业)作为系统中的各个要素的综合生产率,以区别于要素生产率(如技术生产率)。测算公式为:全要素生产率=产出总量/全部资源投入量。 数据测算:包含OL、FE、LP、OP、GMM共五种TFP测算方法!数据结果包括excel和dta格式,其中重要指标包括证券代码,固定资产净额,营业总收入,营业收入,营业成本,销售费用,管理费用,财务费用,购建固定资产无形资产和其他长期资产支付的现金,支付给职工以及为职工支付的现金,员工人数,折旧摊销,行业代码,上市日期,AB股交叉码,退市日期,年末是否ST或PT等变量指标分析。文件包括计算方法说明及原始数据和代码。 数据名称:上市公司全要素生产率TFP数据及测算方法(OL、FE、LP、OP、GMM) 数据年份:2000-2023年 数据指标:证券代码、year、TFP_OLS、TFP_FE、TFP_LP1、TFP_OP、TFP_OPacf、TFP_GMM
内容概要:本文详细总结了多种编程语言下常用的算法实现资源,涵盖Python、C++、Java等流行编程语言及其相关的开源平台、在线课程和权威书籍。对于每种语言而言,均提供了具体资源列表,包括开源项目、标准库支持、在线课程及专业书籍推荐。 适合人群:适用于所有希望深入研究并提高特定编程语言算法能力的学习者,无论是编程新手还是有一定经验的技术人员。 使用场景及目标:帮助开发者快速定位到合适的算法学习资料,无论是出于个人兴趣自学、面试准备或是实际工作中遇到的具体算法问题,都能找到合适的解决方案。 其他说明:文中提及多个在线学习平台和社区网站,不仅限于某一特定语言,对于跨学科或多元化技能培养也具有很高的参考价值。
基于springboot的交通旅游订票系统源码数据库文档.zip
内容概要:本文档是一份详细的GO语言教程,涵盖了Go语言的基础语法、数据类型、控制结构、函数、结构体、接口以及并发编程等多个方面。主要内容包括Go语言的基本概念和历史背景、环境配置、基本语法(如变量、数据类型、控制结构)、函数定义与调用、高级特性(如闭包、可变参数)、自定义数据类型(如结构体、接口)以及并发编程(如goroutine、channel、select)等内容。每部分内容都附有具体的代码示例,帮助读者理解和掌握相关知识点。 适合人群:具备一定编程基础的开发者,尤其是希望深入学习和应用Go语言的技术人员。 使用场景及目标:①初学者通过本教程快速入门Go语言;②有一定经验的开发者系统复习和完善Go语言知识;③实际项目开发中利用Go语言解决高性能、高并发的编程问题。 阅读建议:本文档全面介绍了Go语言的各项基础知识和技术细节,建议按章节顺序逐步学习,通过动手实践代码示例加深理解。对于复杂的概念和技术点,可以通过查阅更多资料或进行深入研究来巩固知识。
GEE训练教程
memcached笔记资料,配套视频:https://www.bilibili.com/list/474327672?sid=4486766&spm_id_from=333.999.0.0&desc=1
基于springboot校内跑腿业务系统源码数据库文档.zip
计算机控制光感自动窗帘控制系统设计.doc
基于SpringBoot的校园服务系统源码数据库文档.zip
基于SpringBoot+Vue的美容店信息管理系统源码数据库文档.zip
基于springboot程序设计基础课程辅助教学系统源码数据库文档.zip
这是一个原生的JS网页版斗地主小游戏,代码注释全。带有斗地主游戏基本的地主、选牌、提示、出牌、倒计时等功能。简单好玩,欢迎下载