博客
关于我
mybatisplus按某一字段查询的一个坑
阅读量:767 次
发布时间:2019-03-24

本文共 1990 字,大约阅读时间需要 6 分钟。

优化后的技术文章

baomidou.mybatisplus封装的方法按指定字段查询数据库时,返回的 List 只有长度,没有元素。此问题通常发生在查询条件不正确或者数据存储存在问题时。让我详细分析一下如何解决这一问题,并帮助你找到最优的查询方式。

问题描述

你的代码如下:

public List< String >      getObtainerList() {    List< CreditReportRecord >          creditReportRecords = this.baseMapper.selectList(            Wrappers.< CreditReportRecord >                .lambdaQuery()                .select(CreditReportRecord::getObtainName)        );    if (CollectionUtils.isEmpty(creditReportRecords)) {        return null;    }    return creditReportRecords.stream()        .map(CreditReportRecord::getObtainName)        .collect(Collectors.toList());}

此代码的目的是从数据库中获取一个叫做obtainName的字段的值。然而在调试过程中,creditReportRecords的长度是188,说明数据库中存在大量的记录。但是,当返回List时,返回的内容却是空的,这说明creditReportRecords中的getObtainName方法返回了null,从而引发NullPointerException错误。

原因分析

  • 字段存储问题:数据库中obtainName字段的值可能全部为null,导致creditReportRecords列表中存在大量null元素。
  • 查询条件不对:如果查询条件没有设置过滤,且数据库中该字段的值均为null,则会直接返回所有记录,包含了null,从而导致最终结果为空。
  • 解决方法

    为了避免NullPointerException错误发生,需要在查询时对字段进行过滤,排除null值的记录。以下是优化后的代码:

    public List< String >      getObtainerList() {    List< CreditReportRecord >          creditReportRecords = this.baseMapper.selectList(            Wrappers.< CreditReportRecord >                .lambdaQuery()                .select(CreditReportRecord::getObtainName)                .isNotNull(CreditReportRecord::getObtainName)        );    return !CollectionUtils.isEmpty(creditReportRecords)        ? creditReportRecords.stream()            .map(CreditReportRecord::getObtainName)            .filter(name -> name != null)            .collect(Collectors.toList())        : null;}

    优点分析:

  • 直接筛选:在lambdaQuery中直接使用isNotNull方法,确保只返回obtainName字段不为null的记录。这样可以减少后续处理的负担。
  • 去空处理:检查creditReportRecords是否为空,避免直接调用stream()方法。如果creditReportRecords为空,则直接返回null,减少不必要的计算。
  • 数据安全:通过filter(name -> name != null)方法进一步确保返回的值是有效的,避免在最高级调用中出现NullPointerException
  • 总结

    通过对查询条件进行优化,使用isNotNull方法对字段进行过滤,可以避免因为null值而导致的错误。同时,合理处理List为空的情况,可以提升代码的健壮性。当数据库中存在大量字段需要通过查询条件过滤时,可以通过逐步筛选,确保只返回有效数据,从而提高应用的运行效率。

    转载地址:http://lunkk.baihongyu.com/

    你可能感兴趣的文章
    Navicate for mysql 数据库设计-数据库分析
    查看>>
    Navicat下载和破解以及使用
    查看>>
    Navicat中怎样将SQLServer的表复制到MySql中
    查看>>
    navicat创建连接 2002-can‘t connect to server on localhost(10061)且mysql服务已启动问题
    查看>>
    Navicat可视化界面导入SQL文件生成数据库表
    查看>>
    Navicat向sqlserver中插入数据时提示:当 IDENTITY_INSERT 设置为 OFF 时,不能向表中的标识列插入显式值
    查看>>
    Navicat因导入的sql文件中时间数据类型有参数而报错的原因(例:datetime(3))
    查看>>
    Navicat如何连接MySQL
    查看>>
    navicat导入.sql文件出错2006- MySQLserver has gone away
    查看>>
    Navicat导入海量Excel数据到数据库(简易介绍)
    查看>>
    Navicat工具Oracle数据库复制 or 备用、恢复功能(评论都在谈论需要教)
    查看>>
    Navicat工具中建立数据库索引
    查看>>
    navicat工具查看MySQL数据库_表占用容量_占用空间是多少MB---Linux工作笔记048
    查看>>
    navicat怎么导出和导入数据表
    查看>>
    Navicat怎样同步两个数据库中的表
    查看>>
    Navicat怎样筛选数据
    查看>>
    Navicat报错connection is being used
    查看>>
    Navicat报错:1045-Access denied for user root@localhost(using passwordYES)
    查看>>
    Navicat控制mysql用户权限
    查看>>
    navicat操作mysql中某一张表后, 读表时一直显示正在载入,卡死不动,无法操作
    查看>>