Mybatis中Oracle和Mysql的Count字段问题

Mybatis中Oracle和Mysql的Count字段问题

我们在进行项目开发时经常会碰到查询总数的问题,所以我们直接是用select count(1) from table来进行查询。那么在Mybatis通常情况下我们是这么写的

<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中就会出现问题。

此处说明解决问题的能力,实在太强,想要变强,还是需要静心分析,底层问题到底出在哪

ResultSetMetaData.getClassNameForJavaType()的方法中可以看到Mysql字段对应的Java字段,我们可以得知在Mysql中查询的count得到的数据库类型是BigInt类型的对应的Java类型是Long

 

解决办法

  • 改代码,将接收的Map<String, BigDecimal>改为Map<String, Object>,然后进行类型转换
  • 改Sql
  • 我们可以看到在Mysql中的Decimal和Numeric类型的都被转化为了BigDecimal,所以在Sql文件中进行类型转换就行
select CAST(count(1) as decimal(18,0)) as "totalCount" from table
 

 

注意: 如果在查询时,将表字段和count(id)全部查出来,需要在java实体类中写一个字段如total,并用@Transient来标注,并且添加get和set方法。

示例sql写法:

    <select id="selectWithFactors" parameterType="com.unicom.udme.dgp.entity.TurnOverRecord" resultMap="BaseResultMap">
        select
        turn_over_id, turn_over_task, operator_time, complete_time, status,turn_over_type, batch,
        turn_over_person, take_over_person, CAST(count(turn_over_id) as decimal(18,0)) as 'total'
        from turn_over_record

        <where>
           1=1
            <if test="status == '1'.toString()">
            /*查询userId转出的记录*/
                and status in ('1', '2', '3')
                and turn_over_person=#{turnOverPerson,jdbcType=BIGINT}
            </if>
            <if test="status == '2'.toString()">
            /*查询userId接收的记录 ,1:待处理,2:已接收, 3:拒绝*/
                and status in ('1','2','3')
                and take_over_person=#{takeOverPerson,jdbcType=BIGINT}
            </if>
        </where>
        group by batch
    </select>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值