mybatis-plus 查询部分字段时,其他字段为null

QueryWrapper<Menu> queryWrapper = new QueryWrapper<>();
queryWrapper.select("menu_id","parent_id", "menu_name").eq("is_menu", 1);
queryWrapper.orderByAsc("sort");
return getBaseMapper().selectList(queryWrapper);

这段代码中,只返回3个字段。

{
    "menuId": 3,
    "parentId": 1,
    "menuName": "商品管理",
    "status": null,
    "isMenu": null,
    "sort": null,
    "updatetime": null,
    "addtime": null,
}

其他未select的字段都为null.
有什么办法可以不用返回这些未select的字段吗?

阅读 7.5k
3 个回答

@JsonInclude(NONNULL)

return
getBaseMapper().selectList(queryWrapper).stream().map(Menu -> Menu.getMenuId()).collect(Collectors.toList());

因为你没查询其余的字段,其余字段未赋值就是null,这个就是正常的,但是你现在要Controller接口返回前端的JSON数据中不包含null值,这个就是你配置json序列化策略的问题了,与MyBatis无关。

Spring MVC默认使用jackson做为序列化和反序列化框架,那你要查找jackson序列化时不返回null值,结合你的问题一共有多种方式。

1.你重新写个对象或者用Map,里面只有你要的几个属性,其他的不写,自然就没了,改动最小,无影响
2.将@JsonInclude(NONNULL)加在当前接口返回的实体类上,但是可能引起其他问题,以这个实体类作为返回值的所有接口,如果某个属性是null值,则返回的数据里这个字段就不返回了,可能引起前端的undefined异常
3.使用以下代码,覆盖默认的序列化配置

@Bean
public ObjectMapper objectMapper(){
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
    return objectMapper;
}

所有接口不返回null值,一劳永逸,但注意影响,这是全局修改。

如果使用fastjson等其他序列化方式,自行查找解决方案,同理。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题