`
niatwangcong
  • 浏览: 87407 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

createSQLQuery时的decimal,long类型问题

阅读更多
 近日做了个项目,数据持久层用的是hibernate.第一次用它就发现这是一个很好的东西.但是难免会碰到问题.
<wbr>问题:</wbr><wbr style="LINE-HEIGHT: 1.3em"></wbr><wbr>
因项目需要,我要做一个通用的查询页面,这里用到一个SQL模板,开始我试了一下,成功.但是后来真正想查询的时候,问题出现了!错误信息如下:
org.hibernate.MappingException: <wbr>No Dialect mapping for JDBC type: 3</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em">
at org.hibernate.dialect.TypeNames.get(TypeNames.java:56)</wbr><wbr style="LINE-HEIGHT: 1.3em">
at org.hibernate.dialect.TypeNames.get(TypeNames.java:81)</wbr><wbr style="LINE-HEIGHT: 1.3em">
at org.hibernate.dialect.Dialect.getHibernateTypeName(Dialect.java:192)</wbr><wbr style="LINE-HEIGHT: 1.3em">
at org.hibernate.loader.custom.CustomLoader.getHibernateType(CustomLoader.java:170)</wbr><wbr style="LINE-HEIGHT: 1.3em">
at org.hibernate.loader.custom.CustomLoader.autoDiscoverTypes(CustomLoader.java:138)</wbr><wbr style="LINE-HEIGHT: 1.3em">
at org.hibernate.loader.Loader.getResultSet(Loader.java:1678)</wbr><wbr style="LINE-HEIGHT: 1.3em">
at org.hibernate.loader.Loader.doQuery(Loader.java:662)</wbr><wbr style="LINE-HEIGHT: 1.3em">
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)</wbr><wbr style="LINE-HEIGHT: 1.3em">
at org.hibernate.loader.Loader.doList(Loader.java:2150)</wbr><wbr style="LINE-HEIGHT: 1.3em">
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2029)</wbr><wbr style="LINE-HEIGHT: 1.3em">
at org.hibernate.loader.Loader.list(Loader.java:2024)</wbr><wbr style="LINE-HEIGHT: 1.3em">
at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:117)</wbr><wbr style="LINE-HEIGHT: 1.3em">
at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1607)</wbr><wbr style="LINE-HEIGHT: 1.3em">
at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:121)</wbr><wbr style="LINE-HEIGHT: 1.3em">
at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:169)</wbr><wbr style="LINE-HEIGHT: 1.3em">
at com.yonder.pm.query.generalQuery.QueryResultViewModel.initDataset(QueryResultViewModel.java:36)</wbr><wbr style="LINE-HEIGHT: 1.3em">
at com.yonder.pm.query.generalQuery.QueryResultViewModel.initDatasets(QueryResultViewModel.java:26)</wbr><wbr style="LINE-HEIGHT: 1.3em">
at com.bstek.dorado.view.ViewModelSupport.init(Unknown Source)</wbr><wbr style="LINE-HEIGHT: 1.3em">
at com.bstek.dorado.view.taglib.AbstractViewTag.doStartTag(Unknown Source)</wbr><wbr style="LINE-HEIGHT: 1.3em">
at org.apache.jsp.query.generalQuery.queryResult_jsp._jspx_meth_d_View_0(queryResult_jsp.java:94)</wbr><wbr style="LINE-HEIGHT: 1.3em">
at org.apache.jsp.query.generalQuery.queryResult_jsp._jspService(queryResult_jsp.java:68)</wbr><wbr style="LINE-HEIGHT: 1.3em">
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)</wbr><wbr style="LINE-HEIGHT: 1.3em">
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)</wbr><wbr style="LINE-HEIGHT: 1.3em">
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:332)</wbr><wbr style="LINE-HEIGHT: 1.3em">
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)</wbr><wbr style="LINE-HEIGHT: 1.3em">
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)</wbr><wbr style="LINE-HEIGHT: 1.3em">
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)</wbr><wbr style="LINE-HEIGHT: 1.3em">
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)</wbr><wbr style="LINE-HEIGHT: 1.3em">
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)</wbr><wbr style="LINE-HEIGHT: 1.3em">
at org.jbpm.webapp.filter.AuthenticationFilter.doFilter(AuthenticationFilter.java:56)</wbr><wbr style="LINE-HEIGHT: 1.3em">
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)</wbr><wbr style="LINE-HEIGHT: 1.3em">
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)</wbr><wbr style="LINE-HEIGHT: 1.3em">
at org.jbpm.web.JbpmContextFilter.doFilter(JbpmContextFilter.java:83)</wbr><wbr style="LINE-HEIGHT: 1.3em">
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)</wbr><wbr style="LINE-HEIGHT: 1.3em">
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)</wbr><wbr style="LINE-HEIGHT: 1.3em">
at com.bstek.dorado.core.FilterHandle.c(Unknown Source)</wbr><wbr style="LINE-HEIGHT: 1.3em">
at com.bstek.dorado.core.FilterHandle.doFilter(Unknown Source)</wbr><wbr style="LINE-HEIGHT: 1.3em">
at com.bstek.dorado.core.DoradoFilter.doFilter(Unknown Source)</wbr><wbr style="LINE-HEIGHT: 1.3em">
at com.yonder.pm.common.PmFilter.doFilter(PmFilter.java:70)</wbr><wbr style="LINE-HEIGHT: 1.3em">
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)</wbr><wbr style="LINE-HEIGHT: 1.3em">
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)</wbr><wbr style="LINE-HEIGHT: 1.3em">
at org.jbpm.webapp.filter.LogFilter.doFilter(LogFilter.java:59)</wbr><wbr style="LINE-HEIGHT: 1.3em">
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)</wbr><wbr style="LINE-HEIGHT: 1.3em">
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)</wbr><wbr style="LINE-HEIGHT: 1.3em">
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)</wbr><wbr style="LINE-HEIGHT: 1.3em">
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)</wbr><wbr style="LINE-HEIGHT: 1.3em">
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)</wbr><wbr style="LINE-HEIGHT: 1.3em">
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)</wbr><wbr style="LINE-HEIGHT: 1.3em">
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)</wbr><wbr style="LINE-HEIGHT: 1.3em">
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)</wbr><wbr style="LINE-HEIGHT: 1.3em">
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)</wbr><wbr style="LINE-HEIGHT: 1.3em">
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)</wbr><wbr style="LINE-HEIGHT: 1.3em">
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)</wbr><wbr style="LINE-HEIGHT: 1.3em">
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)</wbr><wbr style="LINE-HEIGHT: 1.3em">
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)</wbr><wbr style="LINE-HEIGHT: 1.3em">
at java.lang.Thread.run(Thread.java:595)</wbr><wbr style="LINE-HEIGHT: 1.3em">
仔细查看,发现问题在于数据类型.到网上查,发现hibernate在执行List result = session.createSQLQuery(sql).list()的时候,当SQL语句中遇到的decimal,long等类型的字段时,就出现上面的错误.而且从错误信息中可以发现:出错的是Dialect.
<wbr>解决办法:</wbr><wbr style="LINE-HEIGHT: 1.3em"></wbr></wbr><wbr>
错误知道以后,我就到网上找解决办法.看来遇到这类问题的人太多了,网上到处都有人贴这个问题.我看了几篇,发现有个解决办法,就是自定义Hibernate Dialect.虽然所用数据库不同(我用的数据库是DB2),我觉得大同小异,就照着做了:
首先建一个类,继承org.hibernate.dialect.DB2Dialect,该类的内容如下:
import java.sql.Types;</wbr><wbr style="LINE-HEIGHT: 1.3em">
import org.hibernate.Hibernate;</wbr><wbr style="LINE-HEIGHT: 1.3em">
import org.hibernate.dialect.DB2Dialect;</wbr><wbr style="LINE-HEIGHT: 1.3em">
public class PmDb2Dialect extends DB2Dialect</wbr><wbr style="LINE-HEIGHT: 1.3em">
{</wbr><wbr style="LINE-HEIGHT: 1.3em">
public PmDb2Dialect()</wbr><wbr style="LINE-HEIGHT: 1.3em">
{</wbr><wbr style="LINE-HEIGHT: 1.3em">
     super();</wbr><wbr style="LINE-HEIGHT: 1.3em">
     registerHibernateType(Types.DECIMAL, Hibernate.BIG_DECIMAL.getName());</wbr><wbr style="LINE-HEIGHT: 1.3em">
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
第二步,就是修改hibernate的配置文件hibernate.cfg.xml:
将:
     <property name="hibernate.dialect"></wbr><wbr style="LINE-HEIGHT: 1.3em">
      org.hibernate.dialect.DB2Dialect</wbr><wbr style="LINE-HEIGHT: 1.3em">
     </property></wbr><wbr style="LINE-HEIGHT: 1.3em">
改为:
     <property name="hibernate.dialect"></wbr><wbr style="LINE-HEIGHT: 1.3em">
      com.yonder.pm.common.PmDb2Dialect</wbr><wbr style="LINE-HEIGHT: 1.3em">
     </property></wbr><wbr style="LINE-HEIGHT: 1.3em">

相关推荐

    hibernate 的createSQLQuery的几种用法

    这个查询指定了 SQL 查询字符串,并将结果集的实体类型设置为 Cat.class。 二、避免字段名重复的问题 在连接了多个表的查询中,可能出现同样名字的字段,这时我们可以使用占位符来避免字段名重复的问题,例如: ``...

    关于hibernate 的createQuery和createSqlQuery 的区别

    Hibernate 中的 createQuery 和 createSqlQuery 区别详解 在 Hibernate 中,createQuery 和 createSqlQuery 是两个常用的查询方法,但是它们之间存在着一些...因此,在选择使用哪种方法时,需要根据实际情况进行考虑。

    Hibernate的char问题.txt

    处理 Hibernate 中的 `char` 类型数据时,需要注意数据库字段与 Java 实体类之间的映射配置、查询时参数的类型一致性以及类型转换等问题。通过正确配置 Hibernate 映射文件、使用合适的 Hibernate 类型以及注意参数...

    Hibernate SQLQuery 查询Oracle char类型结果为一个字符解决方法

    在使用Hibernate框架结合Oracle数据库进行数据查询时,经常会遇到一个问题:当查询的结果集中包含char类型的字段时,Hibernate可能会将其映射为一个单一的字符,而不是整个字符串。这对于数据处理来说显然是不正确的...

    Native SQL查询 (使用SQLQuery).doc

    这时不再使用 ResultSetMetadata,而是明确的将 ID, NAME 和 BIRTHDATE 按照 Long, String 和 Short 类型从 resultset 中取出。 实体查询(Entity queries) ------------------------- 上面的查询都是返回标量值...

    com.microsoft.sqlserver.jdbc.SQLServerException: 只进结果集不支持请求的操作 解决方案

    最直接的方法是在创建`Session`时指定查询结果集为可滚动类型(scrollable)。这可以通过在Hibernate配置文件中设置`hibernate.connection.autocommit`属性为`false`,并在查询前手动设置事务,然后通过`Session`的`...

    hibernate3中通过nativesql或取部分字段并映射为具体对象的实现

    这种方式在处理一些特定的、效率较高的SQL查询时非常有用。 首先,我们需要理解Hibernate中的`SQLQuery`接口,这是执行原生SQL查询的主要入口。通过`Session`对象的`createSQLQuery`方法,我们可以创建一个`SQL...

    在Java的Hibernate框架中使用SQL语句的简单介绍

    在Java的Hibernate框架中,使用SQL语句是一个常见的需求,特别是在处理特定的数据库操作或优化查询性能时。Hibernate,作为SSH(Spring、Struts、Hibernate)三大Web开发框架之一,提供了一种优雅的方式将对象关系...

    ceateQuery ceateSQLQuery

    在使用Hibernate进行数据查询时,我们常常会遇到两种方式来构造查询:`createQuery`和`createSQLQuery`。这两种方法都是Hibernate提供的,但它们在功能和使用上有所不同。 `createQuery`是基于Hibernate Query ...

    hibernate query调用oracle存储过程

    例如,调用存储过程时,可以将相关操作包裹在Transaction中,以便在出现错误时能够回滚事务。 总之,通过Hibernate的Query接口,我们可以方便地调用Oracle的存储过程和函数,实现复杂的业务逻辑。结合源码和数据库...

    hibernate 执行原生sql的几种方式

    在Java的持久化框架...在使用原生SQL时,需要注意数据库兼容性、事务管理和结果集映射等问题。在大多数情况下,应尽量利用Hibernate的ORM能力,但在处理特定数据库特性和性能优化时,原生SQL是不可或缺的工具。

    hibernate执行原生sql语句

    在上面的代码中,我们使用 `Session.createSQLQuery()` 方法创建了一个 `SQLQuery` 对象,然后使用 `addEntity()` 方法指定了查询结果的实体类型,最后使用 `list()` 方法执行查询并获取结果。 使用 ...

    Hibernate+本地SQL查询SQLQuery宣贯.pdf

    在处理涉及多表的查询时,可能会遇到字段名冲突的问题。为了解决这个问题,可以使用别名: ```java List&lt;Cat&gt; cats = sess.createSQLQuery("select {cat.*} from cats cat") .addEntity("cat", Cat.class) .list...

    hibernate2 升级为hibernate3的需要注意的事项

    在执行 HQL 查询时,`createSQLQuery` 方法的参数需要从 `createSQLQuery(hql,"c",EZCampaignDTO.class)` 改为 `createSQLQuery(hql).addEntity("c", EZCampaignDTO.class)`。这样的改动有助于更灵活地添加实体类型...

    Query对象setResultTransFormer()

    同时,setResultTransformer() 方法也可以将查询结果转换为指定的类型,例如,将查询结果转换为 Integer 类型: ```java Query query = session.createSQLQuery("select sum(id) SUMID from Tree t where pid in ...

    Hibernate+本地SQL查询SQLQuery.pdf

    当查询涉及到多张表时,可能存在同名字段,这可能导致字段映射错误。为了避免这种问题,可以使用别名。例如: ```java List&lt;Cat&gt; cats = sess.createSQLQuery("select {cat.*} from cats cat").addEntity("cat", ...

    如何解决hibernate自动更新实体类的问题共5页.pdf.zip

    在Java的持久化框架Hibernate中,自动更新实体类的问题是一个常见的困扰开发者的问题。当实体类的状态发生改变,Hibernate默认会尝试将这些变化同步到数据库,这在某些情况下并不符合我们的需求。本文将深入探讨这个...

Global site tag (gtag.js) - Google Analytics