本文共 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/