oracle jdbc char 字段 PreparedStatement 查询问题
关键字: oracle jdbc char 昨天出了一个奇怪的问题,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(有可能它故意这样)
评论
如: 抛出异常的爱 说的
既然id是PK,这种做法在查询的时候用PK对应的INDEX就不会被使用
可以考虑用以下形式
from TableName where id=RPAD(?, 10, ' ')
顺便问一下,LZ用的ORACLE驱动的版本是什么版本的
找到了一个相关的
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的长度
----这只是我的瞎猜测。。。网上没找到对这个的相关解释
你的设计上没有什么问题么,这么作不是办法。。。
还是想办法把id中的空格都删了吧。
发表评论
提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则
- 浏览: 8976 次
- 性别:

- 来自: 广州

- 详细资料
搜索本博客
我的相册
共 2 张
最近加入圈子
最新评论
-
[原]自己实现的优先队列 ...
lucene 2.32 中用来实现查询结果存放缓存的时候 在代码里有一个这 ...
-- by moshalanye -
Levenshtein Distance(LD) ...
抄袭检测是,参考: http://www.merriampark.com/ld. ...
-- by chenlb -
Levenshtein Distance(LD) ...
我觉得这个在检查抄袭上估计不行,这个方法好像更关注交换程度,因为抄袭是关键词差不 ...
-- by minstrel -
[原]自己实现的优先队列 ...
引用于是,在有空的时间里写了一下。内容是一个双向链表(带头的,头不作保存数据), ...
-- by stephen -
[原]自己实现的优先队列 ...
取决于你需要解决的问题,插入排序用TreeSet。 插入和移除手段可以多样,真正 ...
-- by llade






评论排行榜