Hibernate不支持ORACLE的rowid查询 (No Dialect mapping for JDBC type: -8)

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章