`
du_bo
  • 浏览: 41663 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类

自定义Hibernate Dialect解决createSQLQuery时的decimal,long类型问题

阅读更多
数据持久层用的是hibernate.第一次用它就发现这是一个很好的东西.但是难免会碰到问题.

问题:

因项目需要,我要做一个通用的查询页面,这里用到一个SQL模板,开始我试了一下,成功.但是后来真正想查询的时候,问题出现了!错误信息如下:

org.hibernate.MappingException: No Dialect mapping for JDBC type: 3
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:192)
at org.hibernate.loader.custom.CustomLoader.getHibernateType(CustomLoader.java:170)
at org.hibernate.loader.custom.CustomLoader.autoDiscoverTypes(CustomLoader.java:138)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1678)
at org.hibernate.loader.Loader.doQuery(Loader.java:662)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
at org.hibernate.loader.Loader.doList(Loader.java:2150)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2029)
at org.hibernate.loader.Loader.list(Loader.java:2024)
at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:117)
at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1607)
at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:121)
at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:169)
at com.yonder.pm.query.generalQuery.QueryResultViewModel.initDataset(QueryResultViewModel.java:36)
at com.yonder.pm.query.generalQuery.QueryResultViewModel.initDatasets(QueryResultViewModel.java:26)
at com.bstek.dorado.view.ViewModelSupport.init(Unknown Source)
at com.bstek.dorado.view.taglib.AbstractViewTag.doStartTag(Unknown Source)
at org.apache.jsp.query.generalQuery.queryResult_jsp._jspx_meth_d_View_0(queryResult_jsp.java:94)
at org.apache.jsp.query.generalQuery.queryResult_jsp._jspService(queryResult_jsp.java:68)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:332)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.jbpm.webapp.filter.AuthenticationFilter.doFilter(AuthenticationFilter.java:56)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.jbpm.web.JbpmContextFilter.doFilter(JbpmContextFilter.java:83)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at com.bstek.dorado.core.FilterHandle.c(Unknown Source)
at com.bstek.dorado.core.FilterHandle.doFilter(Unknown Source)
at com.bstek.dorado.core.DoradoFilter.doFilter(Unknown Source)
at com.yonder.pm.common.PmFilter.doFilter(PmFilter.java:70)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.jbpm.webapp.filter.LogFilter.doFilter(LogFilter.java:59)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Thread.java:595)

仔细查看,发现问题在于数据类型.到网上查,发现hibernate在执行List result = session.createSQLQuery(sql).list()的时候,当SQL语句中遇到的decimal,long等类型的字段时,就出现上面的错误.而且从错误信息中可以发现:出错的是Dialect.

解决办法:

错误知道以后,我就到网上找解决办法.看来遇到这类问题的人太多了,网上到处都有人贴这个问题.我看了几篇,发现有个解决办法,就是自定义Hibernate Dialect.虽然所用数据库不同(我用的数据库是DB2),我觉得大同小异,就照着做了:

首先建一个类,继承org.hibernate.dialect.DB2Dialect,该类的内容如下:

import java.sql.Types;

import org.hibernate.Hibernate;
import org.hibernate.dialect.DB2Dialect;

public class PmDb2Dialect extends DB2Dialect
{
public PmDb2Dialect()
{
     super();
     registerHibernateType(Types.DECIMAL, Hibernate.BIG_DECIMAL.getName());
}
}

第二步,就是修改hibernate的配置文件hibernate.cfg.xml:

将:

     <property name="hibernate.dialect">
      org.hibernate.dialect.DB2Dialect
     </property>

改为:

     <property name="hibernate.dialect">
      com.yonder.pm.common.PmDb2Dialect
     </property>
原文出自:http://www.cnblogs.com/beyondwcm/archive/2007/12/01/979223.html
分享到:
评论

相关推荐

    hibernate3.6.0dialect.jar

    hibernate3.6.0dialect.jar

    hibernate3dialect

    hibernate3dialect

    达梦Hibernate方言2.0至4.0

    Hibernate方言(Dialect)是Hibernate框架中的一个关键概念,它是Hibernate与特定数据库之间通信的桥梁。方言定义了如何将Hibernate的SQL语句转换为特定数据库所理解的SQL,包括列类型、约束、SQL语法等。例如,达梦...

    Hibernate4.0以上 SQLiteDialect.java

    hibernate 4以上Hibernate.INTEGER之类的不能使用了,之前使用的SQLiteDialect.java编译不过去了,这个可以。

    GBase_Hibernate3.2.3_GA-Dialect_8.3.81.51_build50.1.jar

    南大通用GBase数据库GBase_Hibernate3.2.3_GA-Dialect_8.3.81.51_build50.1.jar

    hibernate SQLServer2008Dialect

    SQLServer2008Dialect 优化了原来的分页查询数据方法以及在生成SQL时表后增加了with(nolock)

    Hibernate连接SQLite配置说明和方言代码

    Hibernate连接SQLite配置步骤: 1、添加SQLite库: 1.1、将两个jar包:com.zy.hibernate.dialect.SQLiteDialect.jar、sqlite-jdbc-3.7.2.jar拷贝到“\WEB-INF\lib”文件夹下; 2、配置hibernate: 2.1、将...

    kingbasehibernate3.3.2dialect.jar

    hibernate下的kingbase的jar文件,需要的同学自行下载

    达梦 Hibernate 方言 2.0 至 4.0

    "24.jpg"可能是一个示例或说明图,而"DmDialect2.0-4.0.rar"很可能包含了详细的技术文档或者源代码示例,用于指导开发者如何在Hibernate中配置和使用达梦方言,以及如何解决实际开发过程中遇到的问题。 总的来说,...

    瀚高数据库hibernate方言 hgdb-hibernate-dialect

    瀚高数据库Hibernate方言是针对瀚高数据库(HighGo Database)设计的一种特定的方言实现,用于在Java应用程序中通过Hibernate框架与瀚高数据库进行交互。Hibernate是一个流行的对象关系映射(ORM)工具,它允许开发者...

    Hibernate不同数据库的连接及SQL方言

    Hibernate提供了多种SQL方言,例如org.hibernate.dialect.OracleDialect、org.hibernate.dialect.MySQLDialect、org.hibernate.dialect.SQLServerDialect等。我们可以在配置文件中使用元素来设置SQL方言,例如: ...

    hibernate5相关jar包

    根据你使用的数据库类型,你需要相应的数据库驱动程序,如MySQL、PostgreSQL或Oracle的驱动,以便Hibernate与数据库进行通信。 7. 持久化元数据:`.hbm.xml`或@Entity注解 Hibernate使用持久化元数据来定义Java类...

    hibernate中所有数据库方言

    在探讨Hibernate中所有数据库方言之前,我们先简要回顾一下Hibernate框架本身。Hibernate是一个开源的对象关系映射(ORM)框架,用于Java应用与各种关系型数据库进行交互。它提供了强大的功能,如对象持久化、查询...

    DmDialect-for-hibernate4.0.zip

    在SpringBoot集成Hibernate时,通过配置`spring.jpa.hibernate.dialect`属性,指定使用DmDialect,就能让Hibernate知道如何与达梦数据库进行有效通信。这样,开发人员就可以利用Hibernate的高级特性,如懒加载、事务...

    Hibernate4.0,Hibernate5.2,Hibernate5.6 jar包

    5.6版本还提供了更好的类型安全性和错误检查,减少了运行时错误的可能性。对于大数据量的处理,增加了批量操作和流式API的支持,以提高效率。此外,此版本还增强了对NoSQL数据库的支持,反映了现代应用程序多样化的...

    达梦数据库java驱动包、hibernate方言包

    jar包在dialect目录下: 1. DmDialect-for-hibernate2.0.jar 对应 Jdk1.4及以上, hibernate2.0 环境 2. DmDialect-for-hibernate2.1.jar 对应 Jdk1.4及以上, hibernate2.1 -- 2.X 环境 3. DmDialect-for-hibernate3.0...

    hibernate jar包

    5. **Caching库**:如Hibernate的内置缓存机制,包括一级缓存和二级缓存,以及第三方缓存解决方案如Ehcache或Infinispan的jar包。 6. **其他辅助库**:例如,可能包含用于日期时间处理的Joda-Time,或者用于JSON序列...

    kingbaseV8 hibernate jdbc 驱动

    另外,还有一些以`dialect`结尾的jar文件,如`hibernate-5.0.12.Finaldialect.jar`,这些通常是针对特定数据库的方言(Dialect)实现,用于告诉Hibernate如何正确地与特定类型的数据库进行交互。KingbaseV8的方言...

    hibernate-4.3.11finaldialect.jar

    Hibernate人大金仓jar包

Global site tag (gtag.js) - Google Analytics