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

Spring Data MongoDB比对LocalDateTime实现QrCode过期查询

问题背景

映射到MongoDBqr_code集合的实体类如下:

@Document(collection = "qr_code")
public class QrCode implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    private String qrCodeId;

    @Field
    private String codePay;

    private LocalDateTime expiredIn;

}

目前已实现boolean existsByCodePay(String codePay);方法,用于校验指定codePay对应的二维码记录是否存在。
现在需要新增boolean isQrCodeExpired(String codePay);方法,通过@Query注解实现查询逻辑:匹配传入的codePay,当对应记录的expiredIn字段小于当前时间LocalDateTime.now()时,返回true代表二维码已过期,否则返回false。

解决方案

直接使用如下@Query注解即可实现需求:

@Query(value = "{ 'codePay': ?0, 'expiredIn': { $lt: ?#{T(java.time.LocalDateTime).now()} } }", exists = true)
boolean isQrCodeExpired(String codePay);

写法说明

  • ?0是参数占位符,对应方法传入的第一个参数codePay,用于匹配目标二维码记录
  • ?#{T(java.time.LocalDateTime).now()}是SpEL表达式,在查询执行时动态获取当前时间
  • $lt是MongoDB原生的小于比较运算符,实现expiredIn < 当前时间的判断逻辑
  • exists = true配置表示方法直接返回符合条件的记录是否存在的布尔值,匹配方法的boolean返回类型

注意:如果你的MongoDB实例配置的时区和应用服务时区不一致,需要在SpEL表达式中调整时区转换逻辑,避免时间判断出现误差。如果使用的Spring Data MongoDB版本较低不支持直接传入LocalDateTime类型参数,可以将时间转换为Date类型传入,写法如下:

@Query(value = "{ 'codePay': ?0, 'expiredIn': { $lt: ?#{new java.util.Date()} } }", exists = true)
boolean isQrCodeExpired(String codePay);

内容的提问来源于stack exchange,提问作者Aymen Kanzari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 13:24:21