Spring框架MongoDB中@Query注解查询日期区间报错排查
问题排查与修复方案
核心问题分析
你遇到的查询无结果问题,本质是日期类型不匹配和区间边界处理错误:
- 数据库中
admission_date是带时间戳的Date类型(如2022-07-01T18:30:00.000+00:00),但代码中用String类型参数做字符串比较,MongoDB会将Date字段转成字符串后对比,因格式不一致导致匹配失败。 - 即使类型匹配,用仅含日期无时间的参数作为
$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
相关产品推荐
相关产品推荐

