MongoRepository查询日期范围

9

我的POJO

public class PacketData implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    private final String token = UUID.randomUUID().toString();

    private final ZonedDateTime arrived = ZonedDateTime.now();
}

我打算按照以下方式使用。
@Query("?")
List<PacketData> findPacketArrivedBetween(ZonedDateTime startDate, ZonedDateTime endDate);

是否有一种方法可以将以下查询放到上面的query注释中,以及如何执行大于和小于逻辑?

Query query = new Query().addCriteria(Criteria.where("arrived").gte(startDate).lte(endDate));

Spring Data MongoDB没有内置对ZonedDateTime的支持,只有对LocalDateTime的支持。使用ZonedDateTime需要一个自定义转换器来持久化时区。 - mp911de
1个回答

12

你可以尝试以下几种方法。

不需要查询注释。

List<PacketData> findByArrivedBetween(ZonedDateTime startDate, ZonedDateTime endDate);

使用查询注释。

@Query("{'arrived': {$gte: ?0, $lte:?1 }}")
List<PacketData> findPacketArrivedBetween(ZonedDateTime startDate, ZonedDateTime endDate);

这不是一个有效的答案,因为MongoRepository不支持ZonedDateTime:MongoDB驱动程序使用java.util.Date类型。 - user666
1
@user666 用户已经在使用自定义转换器来适应ZonedDateTime。更多信息请参见https://dev59.com/wVgR5IYBdhLWcg3wm-O6#41146758 - s7vr
有没有办法在@query中发送纪元时间戳?例如,在MongoDB Compass中,我们可以使用new Date([epoch integer])并且它可以正常工作。在Spring Boot JPA中是否可能实现这一点? - user666
我在Mongo 4.0.9上尝试了这个操作,使用@Query注释的between似乎不起作用。但是查询方法技术按预期工作。有什么想法为什么会这样? - Romeo Sierra
我认为findByArrivedBetween实际上返回的是严格小于和大于,而不是等于。 - fayssal el ansari

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接