hibernate增加OracleRowId支持

利用Hibernate的進行標準的SQL進行查詢時,竟然不支持ORACLE的rowid直接查詢:
Java代碼  收藏代碼
  1. session.createSQLQuery("select rowid from oracletablename").list();  

查詢後,程序拋出Hibernate的異常 "No Dialect mapping for JDBC type: -8",從字面上看感覺像是缺少一種數據類型的支持. 我又嘗試着將查詢改成如下方法:
Java代碼  收藏代碼
  1. session.createSQLQuery("select length(rowid) len from oracletablename").list();  
  2. session.createSQLQuery("select nvl2(rowid,'',rowid) orarowid from oracletablename").list();  

上面兩種方法均能成功查詢出結果,但是這就要求在查詢時必須對rowid進行處理,很是麻煩,跟蹤了hibernate的源代碼後,發現,Oracle驅動將rowid作爲一種新的類型來對待,
columntype = -8
columnname = ROWID
但Hibernate中所有的ORACLE9iDIALECT或者其它的方言都沒有註冊與-8對應的列類型,所以當程序運行到
Java代碼  收藏代碼
  1. org.hibernate.dialect.TypeNames.get(-8);  

時就會拋錯.然後就考慮重寫一下Dialect,在構造函數中將 -8這個rowid對應的列類型註冊進行.
Java代碼  收藏代碼
  1. public class Oracle9iOr10gDialet extends Oracle10gDialect {  
  2.     public Oracle9iOr10gDialet(){  
  3.         super();  
  4.         super.registerColumnType(-8"string");////rowid對應的columnType爲-8,將rowid視作一個字段值  
  5.         super.registerHibernateType(-8"string");  
  6.     }  
  7. }  

然後在Hibernate.cfg.xml配置文件中註冊這個方言,最後重新運行,一切OK.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章