您的位置:首页 > 移动开发

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

2013-12-11 11:43 537 查看
出处:(hibernate中使用原生的sql语句,报如下错误:)

  MySQL No Dialect mapping for JDBC type: -1


代码:  

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


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

类型名称显示长度数据库类型JAVA类型JDBC类型(int)Types属性
VARCHARL+NVARCHARjava.lang.String12Types.VARCHAR
CHARNCHARjava.lang.String1Types.CHAR
BLOBL+NBLOBjava.lang.byte[]-4Types.LONGVARBINARY
TEXT65535VARCHARjava.lang.String-1Types.LONGVARCHAR
INTEGER4INTEGER UNSIGNEDjava.lang.Long4Types.INTEGER
TINYINT3TINYINT UNSIGNEDjava.lang.Integer-6Types.TINYINT
SMALLINT5SMALLINT UNSIGNEDjava.lang.Integer5Types.SMALLINT
MEDIUMINT8MEDIUMINT UNSIGNEDjava.lang.Integer4Types.INTEGER
BIT1BITjava.lang.Boolean-7Types.BIT
BIGINT20BIGINT UNSIGNEDjava.math.BigInteger-5Types.BIGINT
FLOAT4+8FLOATjava.lang.Float7Types.REAL
DOUBLE22DOUBLEjava.lang.Double8Types.DOUBLE
DECIMAL11DECIMALjava.math.BigDecimal3Types.DECIMAL
BOOLEAN1同TINYINTjava.lang.Integer-6Types.TINYINT
DATE10DATEjava.sql.Date91Types.DATE
TIME8TIMEjava.sql.Time92Types.TIME
DATETIME19DATETIMEjava.sql.Timestamp93Types.TIMESTAMP
TIMESTAMP19TIMESTAMPjava.sql.Timestamp93Types.TIMESTAMP
YEAR4YEARjava.sql.Date91Types.DATE
解决方法:1

更新hibernate方言(因为最新的hibernate言可能提供了对这种类型的支持)以下是言的汇总:

RDBMS方言
DB2org.hibernate.dialect.DB2Dialect
DB2 AS/400org.hibernate.dialect.DB2400Dialect
DB2 OS390org.hibernate.dialect.DB2390Dialect
PostgreSQLorg.hibernate.dialect.PostgreSQLDialect
MySQLorg.hibernate.dialect.MySQLDialect
MySQL with InnoDBorg.hibernate.dialect.MySQLInnoDBDialect
MySQL with MyISAMorg.hibernate.dialect.MySQLMyISAMDialect
Oracle (any version)org.hibernate.dialect.OracleDialect
Oracle 9i/10gorg.hibernate.dialect.Oracle9Dialect
Sybaseorg.hibernate.dialect.SybaseDialect
Sybase Anywhereorg.hibernate.dialect.SybaseAnywhereDialect
Microsoft SQL Serverorg.hibernate.dialect.SQLServerDialect
SAP DBorg.hibernate.dialect.SAPDBDialect
Informixorg.hibernate.dialect.InformixDialect
HypersonicSQLorg.hibernate.dialect.HSQLDialect
Ingresorg.hibernate.dialect.IngresDialect
Progressorg.hibernate.dialect.ProgressDialect
Mckoi SQLorg.hibernate.dialect.MckoiDialect
Interbaseorg.hibernate.dialect.InterbaseDialect
Pointbaseorg.hibernate.dialect.PointbaseDialect
FrontBaseorg.hibernate.dialect.FrontbaseDialect
Firebirdorg.hibernate.dialect.FirebirdDialect
以mysql为例:如果以前org.hibernate.dialect.MySQLDialect,那么现在改成:org.hibernate.dialect.MySQLInnoDBDialect

方法2: 如果更新方言还是不行,那可以自己写方言,并配置到hibernate中..

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的配置文件:

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


方法3:

使用原生的jdbc,自己包装,不使用createSQLQuery()方法;

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐