版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37014990/article/details/80040851
前段时间,使用mybatis遇到一个奇葩问题。
当返回类型为ResultMap的时候,如果选择的字段为空,那么mybatis会忽略掉该对应属性。
也是就是,你想要这种类型的数据返回:
{
name : "隔壁老王",
age : 20,
sex : "男"
}
然而,却返回这种数据:
{
name : "隔壁老王",
age : 20
}
没错,这是mybatis返回机制的锅。
讲道理,mybatis中不管你使用resultType还是resultMap,其实返回的结果都是结果集的Map。
唯一的不同,就是使用resultType的时候,mybatis会将Map结果集,赋值给resultType所对应的类。
也就是说,结果集合中,为空的字段也会进行赋值。
所以,当使用resultType的时候,是不会造成结果集空值丢失的情况。
那么很明显,解决方案中,就有将resultMap转换成实体类resultType的的方式。
即,根据需求,新建实体类来取代Map。
好吧,解决问题不难,但每次解决都那么繁琐,假设出现一个需求需要返回100个属性,那.......每次都要去新建一个类?
Are you kidding me ?
没错,我们可以尝试着从SQL层解决(mysql),比如使用函数,让选择字段不为空。
即,使用IFNULL(exp1, exp2)。当exp1为空的时候,返回值为expe2
<select id="findHasPowerForDirector" resultMap="sscaxsd">
SELECT
a.id, IFNULL(ifo.full_name, -1) AS full_name, IFNULL(sp.period_name, '空')
AS period_name , IFNULL(pt.thetime, '空') AS thetime
FROM
admin AS a
LEFT JOIN admin_role AS ar
ON a.role_id = ar.id
LEFT JOIN admin_info AS ifo
ON a.id = ifo.admin_id
LEFT JOIN period_director_thetime AS pt
ON a.id = pt.director_id
LEFT JOIN school_period AS sp
ON pt.period_id = sp.period_id
WHERE
a.admin_state != '0'
</select>
最后,好像在配置文件中添加一行配置,也可以解决问题,但是,笔者没成功......emmmm