记一次Mybatis的association使用子查询结果错误排查过程

Mybatis的association使用子查询结果错误

代码

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.li.application.mapper.LgsProfitForecastMapper">


    <resultMap type="LgsProfitForecast" id="LgsProfitForecastResult">
        <association property="predictionCompletionDateStr" select="selectPredictionCompletionDateStr" 
                     column="type" javaType="string"/>
    </resultMap>

    <select id="selectProfitForecastList"  resultMap="LgsProfitForecastResult">
        SELECT
            *
        FROM
            lgs_profit_forecast
    </select>


    <select id="selectPredictionCompletionDateStr" resultType="string">
        select
            GROUP_CONCAT(prediction_completion_date)
        from
            ( select prediction_completion_date from lgs_profit_forecast  where type = #{type}  limit 4)	a
    </select>
</mapper>

需要子查询日期进行拼接

测试结果如图
在这里插入图片描述

问题1:association传入的column列自动映射为null

这个目前不清楚原因

解决办法

可以通过手动配置映射解决

   <resultMap type="LgsProfitForecast" id="LgsProfitForecastResult">
        <result property="type" column="type"/>
        <association property="predictionCompletionDateStr" select="selectPredictionCompletionDateStr" 
                     column="type" javaType="string"/>
    </resultMap>

测试:
在这里插入图片描述

可见赋值正常,但是子查询结果还是有问题

问题2:association子查询结果全部相同

查看控制台日志发现
在这里插入图片描述
在这里插入图片描述

实体类是int类型,但是传入参数自动变成boolean类型

数据库测试
在这里插入图片描述
存的是数字,但可以用boolean类型进行查询

查看数据表字段

在这里插入图片描述

结论

mybatis的association在传入字段时会自动进行数据库的类型映射,而tinyint标准的类型映射为boolean类型。所以1,2,3参数映射全部为true,导致结果一致,且tinyint列在查询时可以直接传入boolean类型查询,会自动映射为0和1

解决

1.修改为int或者varchar类型
2.tinyint的长度给大于1的数
3.数据库jdbc连接添加参数tinyInt1isBit=false

测试

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值