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

Spring框架MongoDB中@Query注解查询日期区间报错排查

问题排查与修复方案

核心问题分析

你遇到的查询无结果问题,本质是日期类型不匹配和区间边界处理错误:

  1. 数据库中admission_date是带时间戳的Date类型(如2022-07-01T18:30:00.000+00:00),但代码中用String类型参数做字符串比较,MongoDB会将Date字段转成字符串后对比,因格式不一致导致匹配失败。
  2. 即使类型匹配,用仅含日期无时间的参数作为$lte边界时,默认对应当天0点,会漏掉当天非0点的记录(比如示例中的2022-07-01T18:30)。

具体修复步骤

1. 修改Controller参数类型

将String改为LocalDate,Spring会自动解析请求参数为日期对象:

@GetMapping("/admissiondates")
public ResponseEntity<List<Patient>> getPatientsBtwnAdmissionDates(
            @RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate minDate,
            @RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate maxDate)
            throws PatientAdmissionException {
    List<Patient> patientsBtwnDatesList = patientService.getPatientsBtwnAdmissionDates(minDate, maxDate);
    return new ResponseEntity<>(patientsBtwnDatesList, HttpStatus.OK);
}

2. 更新Service层逻辑

调整参数类型,并将maxDate加1天,确保包含当天所有时间的记录:

public List<Patient> getPatientsBtwnAdmissionDates(LocalDate minDate, LocalDate maxDate)
            throws PatientAdmissionException {
    // 把maxDate转为次日0点,用$lt替代$lte,覆盖maxDate当天的所有时间
    List<Patient> patientBtwnDatesList = patientRepository.getPatientsBtwnAdmissionDates(minDate, maxDate.plusDays(1));
    if (patientBtwnDatesList.isEmpty()) {
        throw new PatientAdmissionException("Service.PATIENTS_BTW_DATE_NOT_FOUND");
    }
    return patientBtwnDatesList;
}

3. 调整Repository查询

修改参数类型为LocalDate,并更新查询条件:

@Query("{'admission_date': {$gte: ?0, $lt: ?1}}")
public List<Patient> getPatientsBtwnAdmissionDates(LocalDate minDate, LocalDate maxDatePlusOne) throws PatientAdmissionException;

4. 确认实体类字段类型

确保Patient类中admission_date字段为日期类型(而非String):

import org.springframework.data.mongodb.core.mapping.Field;
import java.time.LocalDateTime;

public class Patient {
    // 其他字段...
    @Field("admission_date")
    private LocalDateTime admissionDate;
    // 或者用java.util.Date
    // private Date admission_date;
    
    // getter/setter
}

验证逻辑

以示例文档的admission_date: 2022-07-01T18:30:00.000+00:00为例:

  • 当请求参数为minDate=2022-07-01、maxDate=2022-07-01时,实际查询条件是$gte: 2022-07-01、$lt: 2022-07-02,会匹配到该记录。

内容的提问来源于stack exchange,提问作者Abhishek Mathur

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 19:10:41