- session.createSQLQuery("select rowid from oracletablename").list();
查詢後,程序拋出Hibernate的異常 "No Dialect mapping for JDBC type: -8",從字面上看感覺像是缺少一種數據類型的支持. 我又嘗試着將查詢改成如下方法:
- session.createSQLQuery("select length(rowid) len from oracletablename").list();
- session.createSQLQuery("select nvl2(rowid,'',rowid) orarowid from oracletablename").list();
上面兩種方法均能成功查詢出結果,但是這就要求在查詢時必須對rowid進行處理,很是麻煩,跟蹤了hibernate的源代碼後,發現,Oracle驅動將rowid作爲一種新的類型來對待,
columntype = -8
columnname = ROWID
但Hibernate中所有的ORACLE9iDIALECT或者其它的方言都沒有註冊與-8對應的列類型,所以當程序運行到
- org.hibernate.dialect.TypeNames.get(-8);
時就會拋錯.然後就考慮重寫一下Dialect,在構造函數中將 -8這個rowid對應的列類型註冊進行.
- public class Oracle9iOr10gDialet extends Oracle10gDialect {
- public Oracle9iOr10gDialet(){
- super();
- super.registerColumnType(-8, "string");////rowid對應的columnType爲-8,將rowid視作一個字段值
- super.registerHibernateType(-8, "string");
- }
- }
然後在Hibernate.cfg.xml配置文件中註冊這個方言,最後重新運行,一切OK.