`
chenlb
  • 浏览: 690047 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

oracle jdbc char 字段 PreparedStatement 查询问题

阅读更多

      昨天出了一个奇怪的问题,hibernate通过实体Id(char(10)型)取得数据,session.find("from TableName where id=?","value");取不到数据,但数据库里是有这个条数据。真奇怪,后来用pl/sql看数据库,鼠标点到Id那时,可以看到内容后面还有一些空格,带着期望与质疑把字段里的值自制过来, session.find("from TableName where id=?","value    ");后发现可以。我特别试了下connection.createStatement("select * from table_name where id='value'");则正常取数据,session.find("from TableName where id=?","value");而却找不到数据,然后又试了下
ptmt = connection.prepareStatement(select * from table_name where id=?");
ptmt.setString(1,"year");

这样也不行,以是结论是:jdbc驱动PrepareStatement对char字段类型的查找问题,因为hibernate是用PrepareStatement的,自然,hibernate对char对应的属性条件查找出现找不到的情况,

解决办法是:
1.属性用TRIM函数处理:session.find("from TableName where TRIM(id)=?","value");
2.char改为varchar2类型

今天试了下mysql,它不会这样的情况,所以结论是:Oracle JDBC PreparedStatement的bug(有可能它故意这样)



流浪汗 2007-10-17 22:22 发表评论
分享到:
评论
11 楼 chenlb 2008-10-04  
myy 写道

跟jdbc版本有关,用 ojdbc14.jar (10g版驱动,也可以连到9i库) 应该没问题。



10g 的 ojdbc14.jar(10.2.0.1.0)
10 楼 chenlb 2008-10-04  
armorking 写道

1.属性用TRIM函数处理:session.find("from TableName where TRIM(id)=?","value"); 既然id是PK,这种做法在查询的时候用PK对应的INDEX就不会被使用 可以考虑用以下形式


Sql代码

from TableName where id=RPAD(?, 10, ' ')  from TableName where id=RPAD(?, 10, ' ')
顺便问一下,LZ用的ORACLE驱动的版本是什么版本的


ojdbc14.jar(10.1.0.2.0) 后来出现 ORA-01461: can bind a LONG value only for insert into a LONG column 改用 ojdbc14.jar(10.2.0.1.0)

这篇文章javaeye导不入, 标题太长了.

 
9 楼 myy 2008-09-27  
跟jdbc版本有关,用 ojdbc14.jar (10g版驱动,也可以连到9i库)
应该没问题。
8 楼 liweisex 2008-09-27  
增加一个UserType的类型 在nullSafeGet方法中去掉value的空格,
String value = (String) Hibernate.STRING.nullSafeGet(resultset, as[0]); value=value.trim();
7 楼 chenlb 2008-05-26  
我的做法是,先把ID去空格.
如: 抛出异常的爱 说的
6 楼 armorking 2008-04-18  
1.属性用TRIM函数处理:session.find("from TableName where TRIM(id)=?","value");

既然id是PK,这种做法在查询的时候用PK对应的INDEX就不会被使用
可以考虑用以下形式
from TableName where id=RPAD(?, 10, ' ')



顺便问一下,LZ用的ORACLE驱动的版本是什么版本的
5 楼 yangbb 2008-04-18  
http://forums.oracle.com/forums/thread.jspa;jsessionid=8d92200630de527b2f61c7ef4d3296318c855aa88fe1.e34Tb34Lb34PbO0Lb3eTahiPbNyTe0?messageID=504702

找到了一个相关的
4 楼 yangbb 2008-04-18  
昨天晚上也遇到类似的问题了。

table_name中的column_name是char(XX)。
采用PrepareStatement,"select * from table_name where column_name=?",然后pstmt.setString(1,value),,就查询不到记录。

但是"select * from table_name where column_name='"+value+"'",就没有问题。

如果把column_name改成varchar2就不存在问题。。。

oracle在预编译的时候是不是会对char类型的字段做处理?
比如select * from table_name where column_name=rpad(value,XX,' ')。
XX是根据column_name定义的char的长度
----这只是我的瞎猜测。。。网上没找到对这个的相关解释
3 楼 抛出异常的爱 2007-10-22  
汗。。。ID中有空格。。。。
你的设计上没有什么问题么,这么作不是办法。。。
还是想办法把id中的空格都删了吧。
2 楼 chenlb 2007-10-19  
我没有报告吧,只是说下开发出现的问题.
1 楼 movingboy 2007-10-18  
楼主你很有勇气啊,这样就报告了一条bug

相关推荐

    Java面试宝典2020修订版V1.0.1.doc

    20、JDBC中的PreparedStatement相比Statement的好处 71 21、写一个用jdbc连接实例。 71 22、ArrayList和Vector的区别? 73 23、List、Set和Map的区别? 74 24、Collection 和 Collections的区别。 74 25、Set里的...

    java面试800题

    Q0032 Oracle的集合操作函数,如sum(),avg(),max(),min(),与select,where,grouby,having的先后顺序,使用方法 Oracle集合查询基本知识,只有进行分组的列,才可以取在集合查询SQL语句中取字段,先Group By,再Having...

    Java面试宝典2010版

    23、JDBC中的PreparedStatement相比Statement的好处 24. 写一个用jdbc连接并访问oracle数据的程序代码 25、Class.forName的作用?为什么要用? 26、大数据量下的分页解决方法。 27、用 JDBC 查询学生成绩单, 把主要...

    最新Java面试宝典pdf版

    23、JDBC中的PreparedStatement相比Statement的好处 110 24. 写一个用jdbc连接并访问oracle数据的程序代码 111 25、Class.forName的作用?为什么要用? 111 26、大数据量下的分页解决方法。 111 27、用 JDBC 查询学生...

    Java面试笔试资料大全

    23、JDBC中的PreparedStatement相比Statement的好处 110 24. 写一个用jdbc连接并访问oracle数据的程序代码 111 25、Class.forName的作用?为什么要用? 111 26、大数据量下的分页解决方法。 111 27、用 JDBC 查询学生...

    JAVA面试宝典2010

    23、JDBC中的PreparedStatement相比Statement的好处 110 24. 写一个用jdbc连接并访问oracle数据的程序代码 111 25、Class.forName的作用?为什么要用? 111 26、大数据量下的分页解决方法。 111 27、用 JDBC 查询学生...

    Java面试宝典-经典

    23、JDBC中的PreparedStatement相比Statement的好处 110 24. 写一个用jdbc连接并访问oracle数据的程序代码 111 25、Class.forName的作用?为什么要用? 111 26、大数据量下的分页解决方法。 111 27、用 JDBC 查询学生...

    java面试题大全(2012版)

    23、JDBC中的PreparedStatement相比Statement的好处 110 24. 写一个用jdbc连接并访问oracle数据的程序代码 111 25、Class.forName的作用?为什么要用? 111 26、大数据量下的分页解决方法。 111 27、用 JDBC 查询学生...

    Java面试宝典2012版

    23、JDBC中的PreparedStatement相比Statement的好处 110 24. 写一个用jdbc连接并访问oracle数据的程序代码 111 25、Class.forName的作用?为什么要用? 111 26、大数据量下的分页解决方法。 111 27、用 JDBC 查询...

    java面试宝典2012

    23、JDBC中的PreparedStatement相比Statement的好处 120 24. 写一个用jdbc连接并访问oracle数据的程序代码 121 25、Class.forName的作用?为什么要用? 121 26、大数据量下的分页解决方法。 121 27、用 JDBC 查询学生...

    Java面试宝典2012新版

    23、JDBC中的PreparedStatement相比Statement的好处 110 24. 写一个用jdbc连接并访问oracle数据的程序代码 111 25、Class.forName的作用?为什么要用? 111 26、大数据量下的分页解决方法。 111 27、用 JDBC 查询学生...

    Java 面试宝典

    7、char 型变量中能不能存贮一个中文汉字?为什么? ................................................ 10 8、用最有效率的方法算出 2 乘以 8 等於几? ..............................................................

Global site tag (gtag.js) - Google Analytics