今天遇到一个很奇怪的问题,执行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 哈哈,神奇的好了!