在oracle中执行以下sql
create table A (
id char(5)
);
insert into A values('11');
使用以下java代码查询该记录
String sql="select * from A where id=?";
pstm=conn.prepareStatement(sql);
pstm.setString(1,"11");
rs=pstm.executeQuery();
System.out.println(rs.next());
呵呵...是不是查不到任何东西啊,将sql改掉看看:
String sql="select * from A where trim(id)=?";
是不是查出来了,哈!,可是能不能不用trim()就能查出来呢?
那是可以的!
请看代码:
String sql="select * from A where id=?";
pstm=conn.prepareStatement(sql);
((OraclePreparedStatement)pstm).setFixedCHAR(1, "11");
rs=ps.executeQuery();
System.out.println(rs.next());
执行看看,查询成功!
这是为什么呢,由于我英文水平不好,所以请打开以下链接看看!
对于hibernate查询oracle char类型可谓是遇到大麻烦了,因为hibernate内部使用的是PrepareStatement,在查询oracle char类型时会出现上述的问题,我的解决方案是定义一个UserType,该UserType对字段值自动补齐空格,以下是我的配制文件示例:
5
test.OracleCharType就是我自定义的UserType类,它实现了当我们传进来的id值少于5位时,自动加空格,使id值满足5位.
这样,当我们使用以下语句获取对象,便能获取到了.
session.get(A.class,"11")
它底层的查询语句会转换成
select * from A where id='11 ';
怎么样,明白了不.你可能会说为什么使用加空格而不使用trim()函数截取的方式,那是因为hibernate的UserType只能对字段值做手脚(如:'11'变成了'11 ').
这种方案只需要定义一个UserType,然后在hbm文件里配制一下就可使用了.
当然这只是其中一种解决方案,如果你不嫌麻烦的话,可以将查询都改成hql+trim()的方式查询,那么工作量会加很多.
也可以为每个po对象加一个
自己做个继承类就好,不要随便修改framework,否则以后它升级了你再去改源代码再编译?
Java代码
- public class TrimStringType extends StringType {
- public Object get(ResultSet rs, String name); throws SQLException {
- return ((String);super.get(rs, name););.trim();;
- }
- }
