news 2026/11/4 15:34:26

Spring Boot MyBatis-Plus处理日期查询代码报错分析与修复

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Spring Boot MyBatis-Plus处理日期查询代码报错分析与修复
以下spring boot + mybatis-plus代码报错: /** * 获取资金信息列表 */ public List<CapitalInfoVO> queryList(@NotNull CapitalInfoQueryDTO queryDTO) { LambdaQueryWrapper<CapitalInfo > queryWrapper = new LambdaQueryWrapper<>(); // 构造查询条件 queryWrapper // 模糊查询 - 资金序号 .like(StringUtils.hasText(queryDTO.getCapitalNo()), CapitalInfo::getCapitalNo, queryDTO.getCapitalNo()) // 模糊查询 - 资金名称 .like(StringUtils.hasText(queryDTO.getCapitalName()), CapitalInfo::getCapitalName, queryDTO.getCapitalName()) // 精确查询 - 资金类别 .eq(StringUtils.hasText(queryDTO.getCapitalType()), CapitalInfo::getCapitalType, queryDTO.getCapitalType()) // 精确查询 - 指标类别 .eq(StringUtils.hasText(queryDTO.getCapitalIndexType()), CapitalInfo::getCapitalIndexType, queryDTO.getCapitalIndexType()) // 模糊查询 - 资金账户 .like(StringUtils.hasText(queryDTO.getCapitalAccount()), CapitalInfo::getCapitalAccount, queryDTO.getCapitalAccount()) // 精确查询 - 资金来源 .eq(StringUtils.hasText(queryDTO.getCapitalSource()), CapitalInfo::getCapitalSource, queryDTO.getCapitalSource()) // 精确查询 - 指标来源 .eq(StringUtils.hasText(queryDTO.getCapitalIndexSource()), CapitalInfo::getCapitalIndexSource, queryDTO.getCapitalIndexSource()) // 精确查询 - 资金年份 .eq(queryDTO.getCapitalYear() != null, CapitalInfo::getCapitalYear, queryDTO.getCapitalYear()) // 精确查询 - 资金状态 .eq(queryDTO.getCapitalState() != null, CapitalInfo::getCapitalState, queryDTO.getCapitalState()) // 模糊查询 - 备注信息 .like(StringUtils.hasText(queryDTO.getRemark()), CapitalInfo::getRemark, queryDTO.getRemark()) // between - 创建日期 .between( queryDTO.getCreateDate().size() == 2, CapitalInfo::getCreateTime, DateUtils.parseDateTimeRange(queryDTO.getCreateDate()).get(0), DateUtils.parseDateTimeRange(queryDTO.getCreateDate()).get(1) ) // 倒序排序 - 资金年份 .orderByDesc(CapitalInfo::getCapitalYear) // 倒序排序 - 主键id .orderByDesc(CapitalInfo::getId); List<CapitalInfo> capitalInfos = capitalInfoMapper.selectList(queryWrapper); // List<CapitalInfo> -> List<CapitalInfoVO> return capitalInfos.stream() .map(capitalInfo -> { CapitalInfoVO capitalInfoVO = new CapitalInfoVO(); BeanUtils.copyProperties(capitalInfo, capitalInfoVO); return capitalInfoVO; }) .collect(Collectors.toList()); } 报错: java.lang.IndexOutOfBoundsException: Index 0 out of bounds for length 0 at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64) ~[na:na] at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70) ~[na:na] at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:266) ~[na:na] at java.base/java.util.Objects.checkIndex(Objects.java:359) ~[na:na] at java.base/java.util.ArrayList.get(ArrayList.java:427) ~[na:na] at com.weiyu.service.CapitalInfoService.queryList(CapitalInfoService.java:67) ~[classes/:na] at com.weiyu.controller.CapitalInfoController.queryList(CapitalInfoController.java:53) ~[classes/:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na] at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:355) ~[spring-aop-6.1.15.jar:6.1.15] at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) ~[spring-aop-6.1.15.jar:6.1.15] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-6.1.15.jar:6.1.15] at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) ~[spring-aop-6.1.15.jar:6.1.15] at org.springframework.aop.framework.adapter.MethodBeforeAdviceInterceptor.invoke(MethodBeforeAdviceInterceptor.java:58) ~[spring-aop-6.1.15.jar:6.1.15] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.1.15.jar:6.1.15] at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) ~[spring-aop-6.1.15.jar:6.1.15] at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) ~[spring-aop-6.1.15.jar:6.1.15] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.1.15.jar:6.1.15] at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) ~[spring-aop-6.1.15.jar:6.1.15] at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:720) ~[spring-aop-6.1.15.jar:6.1.15] at com.weiyu.controller.CapitalInfoController$$SpringCGLIB$$0.queryList(<generated>) ~[classes/:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na] at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:255) ~[spring-web-6.1.15.jar:6.1.15] at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:188) ~[spring-web-6.1.15.jar:6.1.15] at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) ~[spring-webmvc-6.1.15.jar:6.1.15] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926) ~[spring-webmvc-6.1.15.jar:6.1.15] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831) ~[spring-webmvc-6.1.15.jar:6.1.15] at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-6.1.15.jar:6.1.15] at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089) ~[spring-webmvc-6.1.15.jar:6.1.15] at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) ~[spring-webmvc-6.1.15.jar:6.1.15] at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) ~[spring-webmvc-6.1.15.jar:6.1.15] at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914) ~[spring-webmvc-6.1.15.jar:6.1.15] at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590) ~[tomcat-embed-core-10.1.33.jar:6.0] at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) ~[spring-webmvc-6.1.15.jar:6.1.15] at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) ~[tomcat-embed-core-10.1.33.jar:6.0] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195) ~[tomcat-embed-core-10.1.33.jar:10.1.33] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.33.jar:10.1.33] at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) ~[tomcat-embed-websocket-10.1.33.jar:10.1.33] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.33.jar:10.1.33] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.33.jar:10.1.33] at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-6.1.15.jar:6.1.15] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.15.jar:6.1.15] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.33.jar:10.1.33] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.33.jar:10.1.33] at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-6.1.15.jar:6.1.15] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.15.jar:6.1.15] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.33.jar:10.1.33] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.33.jar:10.1.33] at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-6.1.15.jar:6.1.15] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.15.jar:6.1.15] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.33.jar:10.1.33] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.33.jar:10.1.33] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) ~[tomcat-embed-core-10.1.33.jar:10.1.33] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) ~[tomcat-embed-core-10.1.33.jar:10.1.33] at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483) ~[tomcat-embed-core-10.1.33.jar:10.1.33] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) ~[tomcat-embed-core-10.1.33.jar:10.1.33] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) ~[tomcat-embed-core-10.1.33.jar:10.1.33] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[tomcat-embed-core-10.1.33.jar:10.1.33] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) ~[tomcat-embed-core-10.1.33.jar:10.1.33] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:397) ~[tomcat-embed-core-10.1.33.jar:10.1.33] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-10.1.33.jar:10.1.33] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:905) ~[tomcat-embed-core-10.1.33.jar:10.1.33] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741) ~[tomcat-embed-core-10.1.33.jar:10.1.33] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-10.1.33.jar:10.1.33] at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190) ~[tomcat-embed-core-10.1.33.jar:10.1.33] at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-10.1.33.jar:10.1.33] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) ~[tomcat-embed-core-10.1.33.jar:10.1.33] at java.base/java.lang.Thread.run(Thread.java:842) ~[na:na]

根据堆栈跟踪,错误发生在CapitalInfoService.java的第 67 行。查看您的代码,这个位置是:

java

.between( queryDTO.getCreateDate().size() == 2, CapitalInfo::getCreateTime, DateUtils.parseDateTimeRange(queryDTO.getCreateDate()).get(0), DateUtils.parseDateTimeRange(queryDTO.getCreateDate()).get(1) )

错误IndexOutOfBoundsException: Index 0 out of bounds for length 0表示您尝试访问一个空列表的第一个元素。

问题分析:

  1. 当queryDTO.getCreateDate()为null或空列表时,调用.size()会导致空指针异常,但这里显然不是这种情况,因为您已经检查了.size() == 2

  2. 更可能的问题是DateUtils.parseDateTimeRange(queryDTO.getCreateDate())返回了一个空列表,即使传入的queryDTO.getCreateDate()不为空且有 2 个元素

解决方案:

修改您的代码,确保在访问列表元素之前先验证列表不为空:

java

public List<CapitalInfoVO> queryList(@NotNull CapitalInfoQueryDTO queryDTO) { LambdaQueryWrapper<CapitalInfo> queryWrapper = new LambdaQueryWrapper<>(); // 构造查询条件 queryWrapper // 模糊查询 - 资金序号 .like(StringUtils.hasText(queryDTO.getCapitalNo()), CapitalInfo::getCapitalNo, queryDTO.getCapitalNo()) // 模糊查询 - 资金名称 .like(StringUtils.hasText(queryDTO.getCapitalName()), CapitalInfo::getCapitalName, queryDTO.getCapitalName()) // 精确查询 - 资金类别 .eq(StringUtils.hasText(queryDTO.getCapitalType()), CapitalInfo::getCapitalType, queryDTO.getCapitalType()) // 精确查询 - 指标类别 .eq(StringUtils.hasText(queryDTO.getCapitalIndexType()), CapitalInfo::getCapitalIndexType, queryDTO.getCapitalIndexType()) // 模糊查询 - 资金账户 .like(StringUtils.hasText(queryDTO.getCapitalAccount()), CapitalInfo::getCapitalAccount, queryDTO.getCapitalAccount()) // 精确查询 - 资金来源 .eq(StringUtils.hasText(queryDTO.getCapitalSource()), CapitalInfo::getCapitalSource, queryDTO.getCapitalSource()) // 精确查询 - 指标来源 .eq(StringUtils.hasText(queryDTO.getCapitalIndexSource()), CapitalInfo::getCapitalIndexSource, queryDTO.getCapitalIndexSource()) // 精确查询 - 资金年份 .eq(queryDTO.getCapitalYear() != null, CapitalInfo::getCapitalYear, queryDTO.getCapitalYear()) // 精确查询 - 资金状态 .eq(queryDTO.getCapitalState() != null, CapitalInfo::getCapitalState, queryDTO.getCapitalState()) // 模糊查询 - 备注信息 .like(StringUtils.hasText(queryDTO.getRemark()), CapitalInfo::getRemark, queryDTO.getRemark()) // 倒序排序 - 资金年份 .orderByDesc(CapitalInfo::getCapitalYear) // 倒序排序 - 主键id .orderByDesc(CapitalInfo::getId); // 处理日期范围查询 - 单独处理以避免空列表访问 if (queryDTO.getCreateDate() != null && queryDTO.getCreateDate().size() == 2) { List<Date> dateRange = DateUtils.parseDateTimeRange(queryDTO.getCreateDate()); if (dateRange != null && dateRange.size() == 2) { queryWrapper.between(CapitalInfo::getCreateTime, dateRange.get(0), dateRange.get(1)); } else { // 可以记录日志或进行其他处理 log.warn("日期解析失败,将跳过日期范围查询条件"); } } List<CapitalInfo> capitalInfos = capitalInfoMapper.selectList(queryWrapper); // List<CapitalInfo> -> List<CapitalInfoVO> return capitalInfos.stream() .map(capitalInfo -> { CapitalInfoVO capitalInfoVO = new CapitalInfoVO(); BeanUtils.copyProperties(capitalInfo, capitalInfoVO); return capitalInfoVO; }) .collect(Collectors.toList()); }

替代方案(如果仍想保持链式调用):

java

// 在链式调用之前处理日期范围 Date startDate = null; Date endDate = null; if (queryDTO.getCreateDate() != null && queryDTO.getCreateDate().size() == 2) { List<Date> dateRange = DateUtils.parseDateTimeRange(queryDTO.getCreateDate()); if (dateRange != null && dateRange.size() == 2) { startDate = dateRange.get(0); endDate = dateRange.get(1); } } // 构造查询条件 queryWrapper // ... 其他条件 .between(startDate != null && endDate != null, CapitalInfo::getCreateTime, startDate, endDate) // ... 排序条件

建议:

  1. 检查DateUtils.parseDateTimeRange方法:这个方法可能在某些输入下返回空列表。您需要确保它正确处理输入并返回预期的结果。

  2. 添加日志记录:记录解析失败的情况,以便调试。

  3. 防御性编程:在处理可能返回空值的方法时,始终进行空值检查。

这样修改后,您的代码将更加健壮,不会因为DateUtils.parseDateTimeRange返回空列表而导致程序崩溃。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/2 3:17:39

当跨链协议开始将业务从「搭桥」拓展至「swap」

撰文&#xff1a;Tia&#xff0c;Techub News 在早期单链时代&#xff0c;角色边界是非常清晰的。桥就是桥&#xff0c;DEX 就是 DEX&#xff0c;DEX 聚合器解决的是「同一条链上怎么换最便宜」。如果你在以太坊上把 ETH 换成 USDC&#xff0c;1inch、Matcha 这类工具就是天然选…

作者头像 李华
网站建设 2026/11/2 3:17:39

企业固定资产管理软件有哪些?全面解析常见产品及对比功能优势

固定资产覆盖设备、办公设施、不动产等多个类别&#xff0c;随着数字化转型深入&#xff0c;固定资产管理软件凭借全生命周期管控、数据实时同步、智能流程优化等优势&#xff0c;成为破解管理难题、提升管控效能的核心工具&#xff0c;为不同规模、不同行业的企业提供标准化、…

作者头像 李华
网站建设 2026/11/2 3:17:39

机器人质量控制十年演进

下面给你一条从工程实践、系统架构与产业治理出发的 「机器人质量控制十年演进路线&#xff08;2025–2035&#xff09;」。 重点不在“指标怎么提”&#xff0c;而在质量控制对象、控制方式和控制位置如何发生根本变化。一、核心判断&#xff08;一句话&#xff09;未来十年&a…

作者头像 李华
网站建设 2026/11/3 6:25:05

数据编织创新脉络:知识图谱在科技成果转化中的应用与价值探索

科易网AI技术转移与科技成果转化研究院在当今科技创新日新月异的时代&#xff0c;科技成果的转化与应用已成为衡量一个地区乃至国家创新能力的重要标尺。然而&#xff0c;科技成果转化路径复杂、信息不对称、资源匹配难等问题&#xff0c;长期制约着创新链与产业链的有效对接。…

作者头像 李华
网站建设 2026/11/2 20:23:46

Ray Tune高效调参实战

&#x1f493; 博客主页&#xff1a;借口的CSDN主页 ⏩ 文章专栏&#xff1a;《热点资讯》 Ray Tune高效调参实战&#xff1a;从理论到生产级优化的深度指南目录Ray Tune高效调参实战&#xff1a;从理论到生产级优化的深度指南 引言&#xff1a;调参困境与Ray Tune的破局点 核心…

作者头像 李华
网站建设 2026/11/4 14:28:18

宝塔部署JAVA项目(保姆级别),零基础入门到精通,收藏这篇就够了

在新版的宝塔面板里&#xff0c;对JAVA支持已经越来越友好了&#xff0c;操作更加方便简单。 首先&#xff0c;将你你宝塔面板升级到7.8版本以上&#xff0c;点击右上角的“更新”即可自动更新到最新版本。如图 关于新版的宝塔面板部署Java项目&#xff0c;下面整理如下&#…

作者头像 李华