最近遇到一个比较奇怪的问题,通过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等聚合函数也会存在这个问题。