Tauruser

          JSF will hibernate in spring.

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            24 隨筆 :: 2 文章 :: 19 評論 :: 0 Trackbacks

          日前用JasperReport制作統(tǒng)計(jì)報(bào)表。
          我要從數(shù)據(jù)庫中Select sum(price) from talbe獲取一些統(tǒng)計(jì)數(shù)據(jù)作為參數(shù)傳給JasperReport生成報(bào)表。為了達(dá)到數(shù)據(jù)本來應(yīng)該有的精度,所以在數(shù)據(jù)庫中price的數(shù)據(jù)類型為decimal(20,2)。由于只是簡單地從數(shù)據(jù)庫把price,sum出來并不需要進(jìn)行更進(jìn)一步的復(fù)雜數(shù)據(jù)處理,所以在實(shí)現(xiàn)中我并沒有為table寫相應(yīng)該的Pojo和hbm文件。所以在Dao層,我使用Hibernate運(yùn)行SQL語句將數(shù)據(jù)檢索出來。代碼如下:

          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());
          ????????}

          ????}
          );
          運(yùn)行的時(shí)候就出現(xiàn)了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?

          出現(xiàn)這個(gè)原因是說服務(wù)器端的數(shù)據(jù)類型并不能和Java的BigDecimal數(shù)據(jù)類型成功映射。
          推想只要在Hibernate里把本對應(yīng)的數(shù)據(jù)類型成功映射起來就可以成功執(zhí)行了。
          解決案如下:
          1、新建一個(gè)MySQLServerDialect extends org.hibernate.dialect.SQLServerDialect 并在里面補(bǔ)充注冊新的類型映射。如下:
          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>

          經(jīng)過這兩步這后就可以正常使用SqlQuery拿到Sql Server 2005里的decimal類型了。

          在SQLServerDialect里的registerHibernateType函數(shù),更詳細(xì)的用法請看:

          http://www.hibernate.org/hib_docs/v3/api/org/hibernate/dialect/Dialect.html#registerHibernateType(int,%20int,%20java.lang.String)
          posted on 2007-01-31 11:22 Tauruser 閱讀(2830) 評論(1)  編輯  收藏

          評論

          # 風(fēng)格vbhjn 2008-01-25 01:47 飛過海健康
          y7e8duiokjkhfy8duiokl  回復(fù)  更多評論
            


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 丹江口市| 吴堡县| 商水县| 洪湖市| 霞浦县| 广南县| 桃园县| 宜春市| 方山县| 庄浪县| 东莞市| 宁德市| 宜章县| 朔州市| 康平县| 荆州市| 星子县| 迭部县| 甘谷县| 乐东| 永泰县| 安泽县| 民和| 西林县| 来安县| 张家港市| 全南县| 文化| 建始县| 平罗县| 汉寿县| 新津县| 万年县| 商河县| 顺昌县| 安仁县| 丰都县| 佛教| 司法| 临桂县| 青铜峡市|