You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Data JPA使用MIN聚合函数查询日期触发空指针异常如何解决

空指针异常原因
  • 核心错误为ActionLogRepository中自定义原生SQL的占位符配置错误:方法定义接收两个参数int jobNo、String id,但SQL中job_no和user_id两个查询条件都使用了?1占位符,导致两个条件都只绑定了第一个参数jobNo的值,你传入的用户ID完全没有被使用。
  • 从异常栈的参数绑定日志可以验证:第二个参数绑定的值为整数87207,和你测试类传入的字符串类型用户IDe734edc0-d47e-4d1a-baa0-a20f935f7d70完全不一致,且user_id字段为字符串类型,绑定整数也无法匹配到记录,最终查询无符合条件的数据,MIN聚合函数返回null。你手动在数据库执行SQL时参数传入正确,因此可以正常得到结果。
  • 直接触发空指针的是测试类中直接对返回的null Date对象调用了toString()方法。
  • 额外不规范点:实体类上的@ConfigurationProperties、Service上的@EnableConfigurationProperties(ActionLog.class)是Spring Boot配置类专用注解,加在实体和业务类上属于错误用法,虽然不直接导致本次异常,但会引入不必要的冗余逻辑。
解决方法
  1. 修正Repository中的SQL占位符,将user_id的匹配条件占位符改为?2:
@Query(value = "SELECT MIN(a.date) FROM action_log a where (a.previous_status = 4) AND (a.job_no = ?1) AND (a.user_id = ?2)", nativeQuery = true)
public Date getMinDateByJobNoAndUserId(int jobNo, String id);
  1. 增加空值防护逻辑,避免直接调用null对象的方法:
    可以在Service层处理空值,无匹配记录时抛出对应业务异常:
public Date getMinDateByJobNoAndUserId(int jobNo, String id) throws PaperTrueJavaException {
    Date minDate = actionLogRepository.getMinDateByJobNoAndUserId(jobNo, id);
    if (minDate == null) {
        throw new PaperTrueJavaException("无符合条件的操作记录,无法查询最早日期");
    }
    return minDate;
}

也可以在测试类调用前先做非空判断:

if (minDateByJobNoAndUserId != null) {
    System.out.println("Min date" + minDateByJobNoAndUserId.toString());
} else {
    System.out.println("未查询到符合条件的记录");
}
  1. 移除冗余错误注解:删除ActionLog实体类上的@ConfigurationProperties("action-log"),删除ActionLogService类上的@EnableConfigurationProperties(ActionLog.class)。

内容的提问来源于stack exchange,提问作者Siddhant Bhandari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 19:18:03