浅谈mybatis返回ResultMap,若是字段为空,返回值属性自动忽略问题。

版权声明:本文为博主原创文章,未经博主允许不得转载。 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




猜你喜欢

转载自blog.csdn.net/qq_37014990/article/details/80040851
今日推荐