mybatis返回结果做了判空,但还是报了空指针异常

最近遇到一个比较奇怪的问题,通过mybatis查询一个list, 判空后还报了空指针异常,
代码如下:

List<TMachineBoxRel> list = tMachineBoxRelDao.getByMachineId(machId, intervalDay);
	if(!list.isEmpty()){
		String boxCode = list.get(0).getBoxCode();
		tBoxBindOrder.setBoxCode(boxCode);
		tBoxBindOrder.setSysBindOrder(1);
		tBoxBindOrderDao.insert(tBoxBindOrder);
		return;
	}

这个代码一看好像没啥问题,但是运行的时候
String boxCode = boxRelByEquipCode.get(0).getBoxCode();
这一句报了空指针异常, 为啥呢???
通过debug发现,boxRelByEquipCode.size()等于1,boxRelByEquipCode.get(0)取值为null
查询sql:

<select id="getByMachineId" resultType="com.eplat.smgr.equip.entity.TMachineBoxRel">
        SELECT
            tr.box_code,tr.equip_code
        FROM `t_machine_box_rel` tr
        LEFT JOIN t_box_bind_order bo on tr.box_code=bo.box_code and bo.data_time>DATE_SUB(now(),INTERVAL #{day} day)
        WHERE tr.equip_code = (select equip_code from t_machine where id=#{machId}) and tr.status=1
        and bo.id is null
    </select>

问题就是sql语句查询的两个字段没有取别名,然后mybatis封装返回结果的时候一个值都找不到,就变成了null.调整sql语句后正常了.

<select id="getByMachineId" resultType="com.eplat.smgr.equip.entity.TMachineBoxRel">
        SELECT
            tr.box_code boxCode,tr.equip_code equipCode
        FROM `t_machine_box_rel` tr
        LEFT JOIN t_box_bind_order bo on tr.box_code=bo.box_code and bo.data_time>DATE_SUB(now(),INTERVAL #{day} day)
        WHERE tr.equip_code = (select equip_code from t_machine where id=#{machId}) and tr.status=1
        and bo.id is null
    </select>

补充:
left join 用的不对也会出这个情况

select c.city,c.city_name cityName,c.province,c.province_name provinceName
from oil_supplier s
left join oil_supplier_area_code c on s.id=c.supplier_id
where s.provider_id=#{id}
order by c.city

这个sql语句,如果c关联不到数据而我取的全部数据都是c表的,最后返回的结果就是
“all elements are null”,原因就是其实这条sql是能查到数据的,比如你用select * 查询是有数据的,只不过我们刚好取了为空的数据,这个时候list.isEmpty()结果为false,list.size()结果为1,所以最后导致空指针异常。
解决办法: 把left join 改为 join 关联查询就好了

类似的还有sum等聚合函数也会存在这个问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值