当在hibernate中运用原始的sql语句进行操作的的时候,常常会报错,错误很多都是关于
No Dialect mapping for JDBC type:?这里的问号是不同的数字如:-1,1,-9,3等等,每种数字代表一种类型。经过分析和查找,问题常常发生在几个地方
1、错误的配置了hibernate的方言
2、就是你的数据库中的字段和java里面的类型不匹配的问题
错误如下:
org.hibernate.MappingException: No Dialect mapping for JDBC type: -1
Error message:
org.hibernate.MappingException: No Dialect mapping for JDBC type: -1
at org.hibernate.dialect.TypeNames.get(TypeNames.java:56)
at org.hibernate.dialect.TypeNames.get(TypeNames.java:81)
at org.hibernate.dialect.Dialect.getHibernateTypeName(Dialect.java:370)
at org.hibernate.loader.custom.CustomLoader$Metadata.getHibernateType(CustomLoader.java:559)
at org.hibernate.loader.custom.CustomLoader$ScalarResultColumnProcessor.performDiscovery(CustomLoader.java:485)
at org.hibernate.loader.custom.CustomLoader.autoDiscoverTypes(CustomLoader.java:501)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1796)
at org.hibernate.loader.Loader.doQuery(Loader.java:674)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
at org.hibernate.loader.Loader.doList(Loader.java:2220)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104)
at org.hibernate.loader.Loader.list(Loader.java:2099)
at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:289)
at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1695)
at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:142)
at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:152)
at com.tilsi.solr.dao.summary.EntryDAO.queryByEntryId(EntryDAO.java:164)
at com.tilsi.solr.service.db.DbSearchThread.searchSummary(DbSearchThread.java:69)
at com.tilsi.solr.service.db.DbSearchThread.call(DbSearchThread.java:48)
at com.tilsi.solr.service.db.DbSearchThread.call(DbSearchThread.java:1)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
解决方法为:通过查询hibernate的源码,找到问题的根本所在,就是hibernate中不支持对应的数据类型,具体数据类型的值,请查看下表
查看 java.sql.Types 类,可以找到对应类型,调整相应的数据库里的类型,或者其他支持这个类型的方言。
public final static int BIT = -7;
public final static int TINYINT = -6;
public final static int SMALLINT = 5;
public final static int INTEGER = 4;
public final static int BIGINT = -5;
public final static int FLOAT = 6;
public final static int REAL = 7;
public final static int DOUBLE = 8;
public final static int NUMERIC = 2;
public final static int DECIMAL = 3;
public final static int CHAR = 1;
public final static int VARCHAR = 12;
public final static int LONGVARCHAR = -1;
public final static int DATE = 91;
public final static int TIME = 92;
public final static int TIMESTAMP = 93;
public final static int BINARY = -2;
public final static int VARBINARY = -3;
public final static int LONGVARBINARY = -4;
public final static int NULL = 0;
public final static int OTHER = 1111;
public final static int JAVA_OBJECT = 2000;
public final static int DISTINCT = 2001;
public final static int STRUCT = 2002;
public final static int ARRAY = 2003;
public final static int BLOB = 2004;
public final static int CLOB = 2005;
public final static int REF = 2006;
public final static int DATALINK = 70;
public final static int BOOLEAN = 16;
public final static int ROWID = -8;
public static final int NCHAR = -15;
public static final int NVARCHAR = -9;
public static final int LONGNVARCHAR = -16;
public static final int NCLOB = 2011;
public static final int SQLXML = 2009;
这类错误,最后的问号表示不确定的数字,但是解决的方法都一样。
首先,自定义一个方言类——Hibernate Dialect,该类需要继承与我们使用的数据库相应的方言类。比如:如果我们用的是MySql(版本为5.x.x),我们需要继承“org.hibernate.dialect.MySQL5Dialect”;如果我们使用的是DB2,那么我们应该继承“org.hibernate.dialect.DB2Dialect”;我用的是SqlServer2008,所以我要继承“org.hibernate.dialect.SQLServerDialect”,参考代码如下:
import java.sql.Types;
import org.hibernate.Hibernate;
import org.hibernate.dialect.SQLServerDialect;
public class SqlServer2008Dialect extends SQLServerDialect {
public SqlServer2008Dialect() {
super();
registerHibernateType(Types.CHAR, Hibernate.STRING.getName());
registerHibernateType(Types.NVARCHAR, Hibernate.STRING.getName());
registerHibernateType(Types.LONGNVARCHAR, Hibernate.STRING.getName());
registerHibernateType(Types.DECIMAL, Hibernate.DOUBLE.getName());
}
}
总之大家可以在“org.hibernate.dialect”这个package中找到与数据库相对应的方言类。在其中,我们需要注意三点:
a、在默认构造方法中继承父类构造方法,同时调用“registerHibernateType(int code, String name)”方法将数据库中该数据类型映射到相应的java类型。code表示数据库中的数据类型整数表示,可以在“java.sql.Types”类中查到相应的数据库类型。name表示我们要映射的java类型。可以从“org.hibernate.Hibernate”中查到。
b、Types类。在Types中定义了数据库常用的字段类型,如:
……
public final static int LONGVARCHAR = -1;
public final static int TIMESTAMP = 93;
……
也就是上面我列出的java.sql.Types。
我们可以根据“No Dialect mapping for JDBC type : ”后面紧跟的数字在该类(Types)中找到相应的类型。我们也可以根据数据表中字段的类型找到相应的值。这个值就是registerHibernateType(int code, String name)的第一个参数。
c、Hibernate类。Hibernate中定义了转换的目的类型,如第一段代码所示。能够转化成什么类型,可以在该类中查找。通过调用“getName()”方法得到一个String型。当然,如果你记住了,我们还可以这样写
import org.hibernate.dialect.SQLServerDialect;
public class SqlServer2008Dialect extends SQLServerDialect {
public SqlServer2008Dialect() {
super();
registerHibernateType(1, "string");
registerHibernateType(-9, "string");
registerHibernateType(-16, "string");
registerHibernateType(3, "double");
}
}
其实和上面是一样的,只是把上面所代表的值直接写出来了。需要注意的是super()方法的调用,不调用该方法是否会出现错误,这个我就不知道了,我没有测试,所以最好调一下。
然后,我们还需要在配置文件中作修改,我将连接数据库的方法放在了spring配置文件中了,这段代码就写在applicationContext.xml里面了:
<property name="hibernateProperties">
<props>
<!-- <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect </prop> -->
<prop key="hibernate.dialect">com.sense.workflow.util.SqlServer2008Dialect</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.cache.use_query_cache">false</prop>
<!-- 显示sql格式 -->
<prop key="hibernate.format_sql">false</prop>
</props>
</property>
最后还有一个解决方法:如果你的数据库表中某个字段不可以不用text类型的,将其改成其他类型(如:varchar等)也可以,这个方法虽然简单,当数据库字段必须用text类型的时候该方法就不行了。
分享到:
相关推荐
Java连接达梦数据库驱动dm_jdbc: dm_jdbc\com.dameng.floader.jar dm_jdbc\com.dameng.impexp.jar dm_jdbc\Dm7Dictionary.jar dm_jdbc\Dm7JdbcDriver14....dm_jdbc\Hibernate Dialect&JDBC;.txt dm_jdbc\version.txt
JDBC驱动主要有四种类型:Type 1、Type 2、Type 3和Type 4。人大金仓Kingbase JDBC驱动通常属于Type 4,即纯Java实现的网络驱动,它提供了一个完全基于Java的数据库连接,无需依赖于特定的本地库,具有良好的跨平台...
"DM达梦数据库jdbc-jar包dialect方言jar包"就是包含了针对达梦数据库的方言实现,它使得这些框架可以正确处理DM达梦数据库特有的SQL语法和存储过程,从而提高代码的可移植性和兼容性。 在使用DM达梦数据库jdbc-jar...
- 加载驱动:`Class.forName("com.gbase.jdbc.Driver")` 对于GBase,`Class.forName("com.infomix.jdbc.IfxDriver")` 对于Infomix。 - 建立连接:`Connection conn = DriverManager.getConnection(url, username, ...
Sap HaNa 数据库链接 jar包。可自定义Maven坐标 添加到私有库 想不要积分,CSDN 最低要求1积分 #mvn install:install-file -Dfile=C:\work\hanajdbclib\ngdbc...#hibernate.dialect=org.hibernate.dialect.SAPDBDialect
Hibernate提供了多种SQL方言,例如org.hibernate.dialect.OracleDialect、org.hibernate.dialect.MySQLDialect、org.hibernate.dialect.SQLServerDialect等。我们可以在配置文件中使用元素来设置SQL方言,例如: ...
- **dialect**:指定Hibernate使用的方言类型,对于H2数据库,通常使用`org.hibernate.dialect.H2Dialect`。 - **driver_class**:指定JDBC驱动的类名。对于H2数据库来说,通常是`org.h2.Driver`。 - **url**:连接...
另外,还有一些以`dialect`结尾的jar文件,如`hibernate-5.0.12.Finaldialect.jar`,这些通常是针对特定数据库的方言(Dialect)实现,用于告诉Hibernate如何正确地与特定类型的数据库进行交互。KingbaseV8的方言...
SQLServer2008Dialect 优化了原来的分页查询数据方法以及在生成SQL时表后增加了with(nolock)
Vertx JDBC 执行器 JDBC Executor 为通过 Vertx 3.0 事件总线访问任何符合 JDBC 的数据源提供了一种快速有效的方法。... dialect: "", pool: { jdbcUrl: "jdbc:hsqldb:mem:testdb", username: "sa", p
Dialect在Hibernate中起着至关重要的作用,它定义了特定数据库的SQL语法、类型映射以及特殊功能。达梦方言则是专门为Hibernate定制,使得Hibernate可以理解和优化针对达梦数据库的SQL语句,从而提高性能和兼容性。 ...
国产数据库DM8,jdbc驱动相关资源。达梦8JDBC驱动分为DmJdbcDriver15、DmJdbcDriver16、...达梦8提供不同hibernate和jdk版本的方言包,用户可根据开发环境选择对应的方言包版本,相关方言包驱动在dialect目录下
神通数据库的jdbc驱动jar包,从自己安装的神通数据库中复制出来,亲测可以使用,分享给需要的人 jdbc.driverClassName=com.oscar.Driver jdbc.url=jdbc:oscar://ip:端口/数据库名称 hibernate.dialect=...
#hibernate.dialect org.hibernate.dialect.H2Dialect #hibernate.connection.driver_class org.h2.Driver #hibernate.connection.username sa #hibernate.connection.password #hibernate.connection.url jdbc:h2:...
"dialect方言jar包"则针对特定数据库的SQL语法特性,因为不同数据库系统的SQL语法略有差异。在使用ORM(Object-Relational Mapping)框架如Hibernate时,方言的作用尤为重要。Hibernate方言是Hibernate框架内一个...
<res-type>javax.sql.DataSource</res-type> //引用类型 <res-auth>Container</res-auth> //引用创建者 </resource-ref> sql方言: RDBMS 方言 DB2 org.hibernate.dialect.DB2Dialect DB2 AS/400 ...
标题中的"jdbc_Java8_达梦8jdbc_"暗示了我们将在Java 8环境中讨论如何使用达梦(DM)数据库的JDBC驱动程序。达梦是中国的一款关系型数据库管理系统,广泛应用于政府、企业等场景。这里我们将深入探讨如何在Java 8中...
本文详细介绍了如何使用 JDBC 连接到各种类型的数据库,包括 Oracle、DB2、SQL Server、Sybase、Informix、MySQL、PostgreSQL 和 Access。此外,还简单介绍了在 Struts 和 Hibernate 中如何进行数据库配置。了解这些...
人大金仓数据库是一款国产的关系型数据库管理系统,其JDBC驱动包是用于在Java应用程序中连接和操作人大金仓数据库的关键组件。"kingbase-jdbc-v8.zip" 是一个包含人大金仓V8版本JDBC驱动的压缩包,适用于需要与金仓...
这个压缩包包含两个关键文件:`Dm7JdbcDriver18-7.6.0.142.jar`和`DmDialect-for-hibernate5.0-1.8.0_65-b17.jar`,分别用于JDBC连接和Hibernate ORM的支持。 首先,我们来详细了解`Dm7JdbcDriver18-7.6.0.142.jar`...