今天遇到一個很奇怪的問題,執行sql報異常,先貼一下我的sql文:
SELECT
A.UNIT_PTN_ID ,
A.DKMK_ID,
A.UPDATE_DATE,
A.UPDATE_BY,
A.ROWID AS ROWID1,
B.DKMK_CD ,
C.BUI_NAI_KOSEI_JUNI
FROM
GTS_UNIT_PTN_KOSEI A
LEFT JOIN
GTS_DKMK B
ON A.DKMK_ID = B.DKMK_ID
LEFT JOIN
GTS_DKMK C
ON C.DKMK_ID=A.DKMK_ID
WHERE
A.UNIT_PTN_ID =?
ORDER BY
C.BUI_NAI_KOSEI_JUNI,
A.DKMK_ID
開始還以爲是我sql寫的有問題,用hibernate輸出的sql文 在OB11 中執行沒有任何問題,但是在程序中一執行就報錯,**No Dialect mapping for JDBC type: -8** 就報這個異常,原來在我引用的數據庫方言中又不支持的關鍵字 ROWID,我用的是oracle10的數據庫方言。rowId在這個數據庫方言中的類型不識別,解決思路重寫一下Dialect,在構造函數中將 -8這個rowid對應的列類型進行註冊。rowid對應的類型值是-8。
columntype = -8 columnname = ROWID
首先新建一個類MysqlDialect:
這個類必須繼承你之前用的數據庫方言的類,我之前用的是Oracle10gDialect,然後註冊rowid的列類型。
public class MysqlDialect extends Oracle10gDialect {
public MysqlDialect() {
super();
super.registerColumnType(-8, "string");
super.registerHibernateType(-8, "string");
}
}
然後在配置數據庫方言的 Hibernate.cfg.xml文件中重新引用剛纔新建的數據庫方言類即可。
<!-- <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect"/> -->
<property name="hibernate.dialect" value="nissan.asf.gates.interceptor.MysqlDialect"/>
註釋掉的是之前引用的oracle10的數據庫方言,現在用的就是剛剛自己做的一個Dialect類
重啓服務,運行,OK 哈哈,神奇的好了!