Spring Boot Criteria Builder日期查询条件失效问题排查
解决Criteria Builder日期查询条件失效问题
你的核心问题是多次调用query.where()会覆盖之前的所有查询条件,最终只有最后一个equal(fileType)的条件生效,导致日期筛选逻辑被完全忽略,所以返回了所有符合文件类型的记录,而非指定日期范围的结果。
修正后的代码
Session session = sessionFactory.getCurrentSession(); CriteriaBuilder builder = session.getCriteriaBuilder(); CriteriaQuery<FilesInfoModel> query = builder.createQuery(FilesInfoModel.class); Root<FilesInfoModel> root = query.from(FilesInfoModel.class); Timestamp startTimestamp = Timestamp.valueOf(restrictProfileDateTime); Timestamp endTimestamp = Timestamp.valueOf(restrictProfileDateTime.plusDays(1)); // 分别定义各个查询条件 Predicate dateStartPredicate = builder.greaterThanOrEqualTo(root.get("createdDate"), startTimestamp); Predicate dateEndPredicate = builder.lessThanOrEqualTo(root.get("createdDate"), endTimestamp); Predicate fileTypePredicate = builder.equal(root.get("fileType"), deltaScreeningFileType); // 用and组合所有条件,一次性传入where方法 query.where(builder.and(dateStartPredicate, dateEndPredicate, fileTypePredicate)); query.select(root); List<FilesInfoModel> filesInfoList = session.createQuery(query).getResultList();
额外检查点
- 确认
restrictProfileDateTime的时间部分是否为00:00:00,这样plusDays(1)得到的次日零点能准确覆盖目标日期的所有时间范围 - 检查
FilesInfoModel中createdDate字段的映射是否正确,确保和SQL Server的datetime2类型匹配(通常使用@Column(columnDefinition = "datetime2")或默认的Timestamp映射即可)
内容的提问来源于stack exchange,提问作者Parth Atara
相关产品推荐
相关产品推荐

