Spring Boot中MongoRepository实现MongoDB时间查询的问题
在Spring Boot中通过MongoRepository实现MongoDB时间戳查询
我明白你遇到的问题了——直接在MongoRepository里写原生MongoDB查询语法肯定过不了编译,因为Spring Data的Repository接口是靠方法命名规则或者@Query注解来定义查询逻辑的,不是直接传查询文档。下面给你两种可行的实现方式:
方法一:利用Spring Data MongoDB的方法命名规则
Spring Data支持根据方法名自动生成查询,非常适合这种简单的条件查询,不需要写额外的查询语句。
首先,在你的ItemRepository接口(继承自MongoRepository<Item, ID>)里定义如下方法:
import org.springframework.data.mongodb.repository.MongoRepository; import java.util.List; public interface ItemRepository extends MongoRepository<Item, String> { // 根据startdate时间戳大于等于指定值查询 List<Item> findByStartdateGreaterThanEqual(long timestamp); }
接下来,你需要把YYYY-MM-DD格式的itemDate字符串转换成对应的时间戳(注意要取当天的起始时间,比如2017-01-01对应的是2017-01-01 00:00:00的时间戳)。推荐用Java 8+的DateTimeFormatter来处理(线程安全,比SimpleDateFormat更可靠):
import java.time.LocalDate; import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; // 转换示例 String itemDate = "2017-01-01"; LocalDate localDate = LocalDate.parse(itemDate, DateTimeFormatter.ISO_LOCAL_DATE); // 转成UTC时区的时间戳(如果你的MongoDB存储的是UTC时间戳,否则根据实际时区调整) long timestamp = localDate.atStartOfDay(ZoneOffset.UTC).toInstant().toEpochMilli(); // 调用Repository方法 List<Item> items = itemRepository.findByStartdateGreaterThanEqual(timestamp);
方法二:使用@Query注解写原生MongoDB查询
如果你更习惯原生的MongoDB查询语法,可以用@Query注解直接定义查询语句,这样和你原来的MongoShell查询逻辑完全一致。
在ItemRepository里定义如下方法:
import org.springframework.data.mongodb.repository.MongoRepository; import org.springframework.data.mongodb.repository.Query; import java.util.List; public interface ItemRepository extends MongoRepository<Item, String> { @Query("{ 'startdate': { '$gte': ?0 } }") List<Item> findItemsByStartdateGte(long timestamp); }
这里的?0表示引用方法的第一个参数,也就是我们传入的时间戳。调用方式和方法一一样,先把itemDate转成时间戳,再传入方法即可。
关键注意点
- 确保你的
Item实体类中,startdate字段的类型是long(因为MongoDB里存储的是时间戳),如果实体类里用的是Date类型,需要调整参数类型和转换逻辑,但你明确说存储的是时间戳,所以用long没问题。 - 时区问题:转换日期时要和MongoDB中存储时间戳的时区一致,比如如果MongoDB里的时间戳是基于UTC的,那转换时也要用UTC时区,避免出现日期偏差。
内容的提问来源于stack exchange,提问作者Glasnhost
相关产品推荐
相关产品推荐

