hibernate:MySQL No Dialect mapping for JDBC type: -1

出处:(hibernate中使用原生的sql语句,报以下错误:)java

  MySQL No Dialect mapping for JDBC type: -1

代码:  mysql

List list = session.createSQLQuery(sql).list();

分析:产生些问题的缘由是因表中的某个字段类型在hibernate中找不到对应的类型。而致使的,每一种类型都对应一种type:sql

类型名称 显示长度 数据库类型 JAVA类型 JDBC类型(int) Types属性
VARCHAR L+N VARCHAR java.lang.String 12  Types.VARCHAR
CHAR N CHAR java.lang.String 1  Types.CHAR
BLOB L+N BLOB java.lang.byte[] -4  Types.LONGVARBINARY
TEXT 65535 VARCHAR java.lang.String -1  Types.LONGVARCHAR
INTEGER 4 INTEGER UNSIGNED java.lang.Long 4  Types.INTEGER
TINYINT 3 TINYINT UNSIGNED java.lang.Integer -6  Types.TINYINT
SMALLINT 5 SMALLINT UNSIGNED java.lang.Integer 5  Types.SMALLINT
MEDIUMINT 8 MEDIUMINT UNSIGNED java.lang.Integer 4  Types.INTEGER
BIT 1 BIT java.lang.Boolean -7  Types.BIT
BIGINT 20 BIGINT UNSIGNED java.math.BigInteger -5  Types.BIGINT
FLOAT 4+8 FLOAT java.lang.Float 7  Types.REAL
DOUBLE 22 DOUBLE java.lang.Double 8  Types.DOUBLE
DECIMAL 11 DECIMAL java.math.BigDecimal 3  Types.DECIMAL
BOOLEAN 1 同TINYINT java.lang.Integer -6  Types.TINYINT
DATE 10 DATE java.sql.Date 91  Types.DATE
TIME 8 TIME java.sql.Time 92  Types.TIME
DATETIME 19 DATETIME java.sql.Timestamp 93  Types.TIMESTAMP
TIMESTAMP 19 TIMESTAMP java.sql.Timestamp 93  Types.TIMESTAMP
YEAR 4 YEAR java.sql.Date 91  Types.DATE

解决方法:1数据库

更新hibernate方言(由于最新的hibernate言可能提供了对这种类型的支持)如下是言的汇总:session

RDBMS 方言
DB2 org.hibernate.dialect.DB2Dialect
DB2 AS/400 org.hibernate.dialect.DB2400Dialect
DB2 OS390 org.hibernate.dialect.DB2390Dialect
PostgreSQL org.hibernate.dialect.PostgreSQLDialect
MySQL org.hibernate.dialect.MySQLDialect
MySQL with InnoDB org.hibernate.dialect.MySQLInnoDBDialect
MySQL with MyISAM org.hibernate.dialect.MySQLMyISAMDialect
Oracle (any version) org.hibernate.dialect.OracleDialect
Oracle 9i/10g org.hibernate.dialect.Oracle9Dialect
Sybase org.hibernate.dialect.SybaseDialect
Sybase Anywhere org.hibernate.dialect.SybaseAnywhereDialect
Microsoft SQL Server org.hibernate.dialect.SQLServerDialect
SAP DB org.hibernate.dialect.SAPDBDialect
Informix org.hibernate.dialect.InformixDialect
HypersonicSQL org.hibernate.dialect.HSQLDialect
Ingres org.hibernate.dialect.IngresDialect
Progress org.hibernate.dialect.ProgressDialect
Mckoi SQL org.hibernate.dialect.MckoiDialect
Interbase org.hibernate.dialect.InterbaseDialect
Pointbase org.hibernate.dialect.PointbaseDialect
FrontBase org.hibernate.dialect.FrontbaseDialect
Firebird org.hibernate.dialect.FirebirdDialect

以mysql为例:若是之前org.hibernate.dialect.MySQLDialect,那么如今改为:org.hibernate.dialect.MySQLInnoDBDialectapp

 

方法2: 若是更新方言仍是不行,那能够本身写方言,并配置到hibernate中..spa

package xm.helper;

import java.sql.Types;
import org.hibernate.Hibernate;
import org.hibernate.dialect.MySQLDialect;
import org.hibernate.dialect.function.StandardSQLFunction;

public class XmMySQLDialect extends MySQLDialect {


public XmMySQLDialect (){
        //把报错的类型注册到hibernate类型的映射中去....
        registerHibernateType(-1, Hibernate.STRING.getName());
        //也能够把mysql类型注册到,好比hibernate支持longtext
        registerColumnType(Types.VARCHAR, "longtext");
    }
}

修改hibernate的配置文件:hibernate

<property name="hibernate.dialect">xm.helper.XmMySQLDialect</property>

 

方法3:code

使用原生的jdbc,本身包装,不使用createSQLQuery()方法;orm

public List<Object[]> exeQuery(final String sql) {
        final List<Object[]> results = new ArrayList<Object[]>();
        sessionFactory.openSession().doWork(new Work() {
            
            public void execute(Connection paramConnection) throws SQLException {
                java.sql.PreparedStatement psta = paramConnection.prepareStatement(sql);
                ResultSet rs = psta.executeQuery();
                int columnCount = rs.getMetaData().getColumnCount();
                
                while(rs.next()){
                    Object[] rows = new Object[columnCount];
                       for (int j=0; j<columnCount; ++j) {
                           rows[j] = rs.getObject(j+1);
                        }
                       results.add(rows);
                    }
          rs.close();      
                psta.close();
                paramConnection.close(); } });
return results; }
相关文章
相关标签/搜索