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