Hibernate HQL如何查询endDate年月日与当前日期完全一致的所有记录
HQL查询日期完全匹配的最优实现方案
你之前的写法仅匹配了日维度参数,缺少年、月的匹配条件,因此会返回跨年月的错误结果。有两种主流实现方案,优先推荐性能更优的范围查询方案:
方案1:时间范围查询(性能最优,支持索引命中)
该方案不对数据库存储的endDate字段做任何函数计算,可正常命中字段上的索引,大数据量下查询效率远高于函数转换方案。逻辑为匹配所有大于等于今日零点、小于明日零点的时间:
Java参数处理
// 生成今日零点、明日零点的时间参数 ZonedDateTime todayStart = ZonedDateTime.now().with(LocalTime.MIN); ZonedDateTime tomorrowStart = todayStart.plusDays(1);
HQL语句
select i from Items i where i.endDate >= :todayStart and i.endDate < :tomorrowStart
方案2:年月日分别匹配(仅适合小数据量场景)
如果不需要考虑索引命中,也可以同时匹配年、月、日三个维度实现需求:
HQL语句
select i from Items i where year(i.endDate) = year(:today) and month(i.endDate) = month(:today) and day(i.endDate) = day(:today)
注:该写法会对endDate字段做三层函数计算,无法命中字段索引,数据量超过10万级时会有明显性能损耗
特殊场景简化方案
如果你的endDate字段在数据库中是DATE类型(无时分秒存储),可直接简化为等值匹配:
Java参数处理
LocalDate today = LocalDate.now();
HQL语句
select i from Items i where i.endDate = :today
内容的提问来源于stack exchange,提问作者ThisCanBeNormal
相关产品推荐
相关产品推荐

