news 2026/7/2 3:22:31

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/6/13 9:45:07

4G智能网关在城市水务管网智能监测中的应用

场景痛点&#xff1a;城市供水管网遍布地下&#xff0c;漏损问题隐蔽难寻&#xff0c;造成巨大的水资源浪费和经济损失。传统的人工巡检与分区计量方式效率低下、响应滞后。管网压力、流量、水质等关键参数无法实现广域、实时的监测&#xff0c;一旦发生爆管或水质污染事件&…

作者头像 李华
网站建设 2026/6/21 16:11:51

【收藏必学】解决大模型“幻觉“的救星:RAG检索增强生成技术全解析,让大模型不再胡说八道

检索增强生成(RAG)技术通过引入外部知识库&#xff0c;有效解决大语言模型因训练数据局限导致的"幻觉"问题。RAG系统通过向量化用户问题、检索相关知识、构建增强提示词和生成回答四个步骤&#xff0c;实现动态获取最新知识&#xff0c;提高回答准确性和时效性。文章…

作者头像 李华
网站建设 2026/6/29 14:34:12

16.RS422

硬件原理图&#xff1a;一种方案&#xff1a;另一种方案&#xff1a;

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

【Java毕设全套源码+文档】基于Web的大学生资助管理系统的设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/7/1 19:49:52

收藏必备:大模型(LLM)学习路线图:从小白到专家的三步进阶之路

文章总结了学习大模型的三个层次路线&#xff1a;首先是工具层&#xff0c;掌握各类AI平台工具&#xff1b;其次是应用开发层&#xff0c;学习私有化部署、Agent、RAG等技术栈并进行实践&#xff1b;最后是模型微调和算法层&#xff0c;包括Transformer架构、机器学习算法、深度…

作者头像 李华