设为首页 收藏本站
查看: 2040|回复: 0

[经验分享] [转] PreparedStatement,hibernate查询oracle char类型解决方案

[复制链接]
YunVN网友  发表于 2016-8-15 07:27:25 |阅读模式
 

  在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对字段值自动补齐空格,以下是我的配制文件示例:
  <id name="id">
    <column name="id"/>
    <type name="test.OracleCharType">
     <param name="length">5</param>
    </type>
    <generator class="assigned" />
</id>
  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对象加一个<sql-query></sql-query>,不过这种方式到没有试过,不知是否可行!
  自己做个继承类就好,不要随便修改framework,否则以后它升级了你再去改源代码再编译?
Java代码 http://www.javaeye.com/images/icon_copy.gif

  • public class TrimStringType extends StringType {   
  •     public Object get(ResultSet rs, String name); throws SQLException {   
  •         return ((String);super.get(rs, name););.trim();;   
  •      }   
  • }  
public class TrimStringType extends StringType { public Object get(ResultSet rs, String name); throws SQLException { return ((String);super.get(rs, name););.trim();; }}  


Java代码 http://www.javaeye.com/images/icon_copy.gif

  • <property name="title" type="mypackage.TrimStringType">   
  •      <column name="TITLE" sql-type="char(80);"/>   
  • </property>  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-257960-1-1.html 上篇帖子: Oracle ORA-600[4193] 解决方法 说明 [转] 下篇帖子: Java 里Spring如何调用oracle存储过程:OracleCallableSupport
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表