No Dialect mapping for JDBC type: 3

我要从数据库中Select sum(price) from talbe获取一些统计数据作为参数传给JasperReport生成报表。为了达到数据本来应该有的精度,所以在数据库中price的数据类型为decimal(20,2)。由于只是简单地从数据库把price,sum出来并不需要进行更进一步的复杂数据处理,所以在实现中我并没有为table写相应该的Pojo和hbm文件。所以在Dao层,我使用Hibernate运行SQL语句将数据检索出来。代码如下:

  BigDecimal totalPrice = (BigDecimal) this .getHibernateTemplate().execute( new  HibernateCallback()  {

        
public  Object doInHibernate(Session session)  throws  HibernateException, SQLException   {
            MonthCheckTable monthCheckTable
= new  MonthCheckTable();
            
            List rs
= session.createSQLQuery( " select sum(price) from table " ).list();
            Number totalPrice 
=  (Number)rs.get( 0 );
            
if (totalPrice == null ) totalPrice = new  BigDecimal( 0.0 );
                        
            
return   new  BigDecimal(totalPrice.toString());
        }
 

    }
);

运行的时候就出现了Maping Excetion,异常栈如下:

org.springframework.orm.hibernate3.HibernateSystemException: No Dialect mapping  for  JDBC type:  3 ; nested exception is org.hibernate.MappingException: No Dialect mapping  for  JDBC type:  3
Caused by: org.hibernate.MappingException: No Dialect mapping 
for  JDBC type:  3  


出现这个原因是说服务器端的数据类型并不能和Java的BigDecimal数据类型成功映射。
推想只要在Hibernate里把本对应的数据类型成功映射起来就可以成功执行了。
解决案如下:
1、新建一个MySQLServerDialect extends org.hibernate.dialect.SQLServerDialect 并在里面补充注册新的类型映射。如下:

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

}


2、把Hibernate里的Dialect改成我们第一步新建的新的Dialect

< prop  key ="hibernate.dialect" > com.gdnfha.atcs.common.MySQLServerDialect </ prop >


经过这两步这后就可以正常使用SqlQuery拿到Sql Server 2005里的decimal类型了。

在SQLServerDialect里的registerHibernateType函数,更详细的用法请看:

http://www.hibernate.org/hib_docs/v3/api/org/hibernate/dialect/Dialect.html#registerHibernateType(int,%20int,%20java.lang.String)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值