咱們在進行項目開發時常常會碰到查詢總數的問題,因此咱們直接是用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>
,而後進行類型轉換咱們能夠看到在Mysql中的Decimal和Numeric類型的都被轉化爲了BigDecimal,因此在Sql文件中進行類型轉換就行spa
select CAST(count(1) as decimal(18,0)) as "totalCount" from table
複製代碼