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
相关产品推荐
相关产品推荐

