当前位置: 首页 > news >正文

CONCAT函数使用中出现空指针异常问题分析

文章目录

  • 前言
  • 为什么?
  • 如何解决?
  • 总结

前言

在项目中,遇到一个场景,使用mysql的CONCAT函数实现字段值拼接,出现如下报错:
总的来说:空指针异常。

  • 原始sql:
<select id="findFailedTaskNames" resultType="java.lang.String">SELECTCONCAT(software_name, '_', software_version, '_', developer) as taskNameFROMxxxWHEREid IN<foreach collection="list" item="item" open="(" close=")" separator=",">#{item}</foreach>
</select>
  • 报错:
2025-11-03 11:10:16.596 [jyh-detect-whl] traceId[] [http-nio-10002-exec-3] ERROR c.q.w.t.c.s.h.ControllerExceptionAdvice - [handleRuntimeException,83] - 请求地址'/detect/task/storage/delete/tasks',发生未知异常.
java.lang.NullPointerException: nullat cn.qbs.wa.teach.course.standard.service.impl.CodeCheckTaskServiceImpl.lambda$deleteFailedTasks$5(CodeCheckTaskServiceImpl.java:417)at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1655)at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913)at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578)at cn.qbs.wa.teach.course.standard.service.impl.CodeCheckTaskServiceImpl.deleteFailedTasks(CodeCheckTaskServiceImpl.java:418)at cn.qbs.wa.teach.course.standard.service.impl.CodeCheckTaskServiceImpl$$FastClassBySpringCGLIB$$372942fe.invoke(<generated>)at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)at org.springframework.aop.framework.CglibAopProxy.invokeMethod(CglibAopProxy.java:386)at org.springframework.aop.framework.CglibAopProxy.access$000(CglibAopProxy.java:85)at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:704)at cn.qbs.wa.teach.course.standard.service.impl.CodeCheckTaskServiceImpl$$EnhancerBySpringCGLIB$$e6d08e42.deleteFailedTasks(<generated>)at cn.qbs.wa.teach.course.standard.controller.web.TrustApplyController.deleteFailedTasks(TrustApplyController.java:152)at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.base/java.lang.reflect.Method.invoke(Method.java:566)at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1067)at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963)at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)at javax.servlet.http.HttpServlet.service(HttpServlet.java:681)at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)at javax.servlet.http.HttpServlet.service(HttpServlet.java:764)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)

为什么?

这是因为,部分字段的值为null,在大多数数据库中(MySQL、PostgreSQL等),CONCAT 函数中任何参数为 NULL 都会导致整个结果为 NULL。

如何解决?

  • 使用 CONCAT_WS,CONCAT_WS 会忽略 NULL 值,只连接非 NULL 的部分。
  • 使用数据库特定的函数:
    • MySQL: IFNULL(字段名, ‘’) 或 COALESCE(字段名, ‘’)
    • PostgreSQL: COALESCE(字段名, ‘’)
  • 使用 CASE WHEN
    • CASE WHEN 字段名 IS NULL THEN '' ELSE 字段名 END

总结

以上为个人学习分享,如有问题,欢迎指出:)

http://www.dtcms.com/a/569433.html

相关文章:

  • 织梦网站挂马教程wordpress数据盘
  • 网站更改备案深圳工程招标交易网
  • 盐城网站建设方案珠海设计公司排名
  • 天津建设网站安管人员成绩查询新闻资讯app开发
  • 2025 Vscode安装Python教程
  • Iconfont 的本质原理和使用场景
  • 企业TB级数据加密迁移至AWS云:AWS Snowball Edge Storage Optimized成本效益方案解析
  • 网站后台是怎么做的上海关键词优化
  • p2p金融网站开发东莞短视频的推广方法
  • 晋江wap站是什么意思自己做的网站怎么爬数据
  • mongo的docker修复
  • Excel怎么快速提取混合单元格中的中文、英文、数字?
  • 易思企业网站管理系统wordpress页面输入密码
  • 网站建设怎么分录网站忘记后台地址
  • 对于不同数据库的一些操作和学习
  • [fmt] 格式化器 (formatter<T, Char>) | 简单情况的`format_as`
  • 智能体如何重塑人机协作?2025职场自动化的架构变革
  • 网站建设需求文档计算机网站建设教程
  • mmap内存映射文件
  • 本地app怎么推广wordpress优化谷歌
  • php55
  • 考前冲刺,倒计时4天!软考网络工程师考前20问
  • AI赋能智慧充电站-全生命周期管理-充电桩软件-实现智能管理
  • 对于网站建设提出建议园林古建设计网站
  • 计算机组成原理:定点数加减法
  • 优秀排版设计网站稳定的网站制作需要多少钱
  • 脑电分析——查找去伪迹的工具
  • 制作网站的公司怎么样做婚恋网站挣钱吗
  • java-File创建文件对象
  • 计算机性能评测体系全解析:从指标到实践