一 需求
遍历一个list,然后循环获取值
二 代码
if(StringUtils.isNotEmpty(booking.getStore_id())) { costAmountList = bookingMapper.getProductCostPrice(bookingId, booking.getStore_id()); } if(costAmountList != null && costAmountList.size() > 0) { if(booking.getContact_gender() == 0) { for(ProductCostPrice item : costAmountList) { log.info("男成本价 "+item.getMale_cost_price()); if(item.getMale_cost_price() != null) { costAmount = costAmount.add(item.getMale_cost_price()); } else { costAmount = BigDecimal.ZERO; } } } }
刚开始做了 list != null && list.size() > 0 判断,并且也判断了字段值 != null ,但是线上还是报空指针,我本地模拟数据,结果是
这让我很想不通,为什么会这样?
原来这个list是多张表left join 取出来的,list是 某张表的别名.* 得来的,我把sql放到navicate执行了一下,发现真的都是NULL,我放开了限制,查出来所有表的数据!哇,前面几张表都有数据,到list这张表就全是null。写到这里,有没有想到什么???
三 分析
关于left join 的问题,left join:如果主表查出数据,右表不管是什么情况,都显示出来!即使都是NULL!
如果有多个left join,一定要分清楚什么是主表,不然会出现,pcp.* 全是null,即使后台list.size() =1,并且也符合 list != null && list.size() > 0 ,但是,显示 all elements are null。解决办法是,把需要用到到那张表当作主表,这样,因为左表没有数据,想到 LEFT JOIN,so list 为空!
所有注意两点:LEFT JOIN ,谁是主表!