Mybatis中Oracle和Mysql的Count字段問題

Mybatis中Oracle和Mysql的Count字段問題

咱們在進行項目開發時常常會碰到查詢總數的問題,因此咱們直接是用select count(1) from table來進行查詢。那麼在Mybatis一般狀況下咱們是這麼寫的sql

<select id="testCount" resultType="int">
    select count(1) as "totalCount" from ams.t_ams_ac_pmt_dtl
</select>
複製代碼

這樣作是沒問題的,不管是在Oracle仍是Mysql,由於Mybatis中有類型處理器,當其檢測到resultType時會將其值轉化爲Int類型的值。因此接收是沒問題的。可是若是是以下的寫法的話,將resultType變爲Map,那麼就會有問題。數據庫

<select id="testCount" resultType="Map">
    select count(1) as "totalCount" from ams.t_ams_ac_pmt_dtl
</select>

複製代碼

在Mybatis中若是resultType是Map的話,那麼在接收結果參數的時候會實例化一個Map<String,Object>的Map,問題就出如今這,在以前的代碼中是用Map<String,BigDecimal>來接收的,這在Oracle中是沒有問題的,由於在Oracle中count函數得到的值在Java對應的類型是BigDecimal,可是在Mysql中就會出現問題。bash

ResultSetMetaData.getClassNameForJavaType()的方法中能夠看到Mysql字段對應的Java字段,咱們能夠得知在Mysql中查詢的count獲得的數據庫類型是BigInt類型的對應的Java類型是Long函數

解決辦法

  • 改代碼,將接收的Map<String, BigDecimal>改成Map<String, Object>,而後進行類型轉換
  • 改Sql

咱們能夠看到在Mysql中的Decimal和Numeric類型的都被轉化爲了BigDecimal,因此在Sql文件中進行類型轉換就行spa

select CAST(count(1) as decimal(18,0)) as "totalCount" from table

複製代碼
相關文章
相關標籤/搜索