背景
JPA+MongoDB查询,给定一段时间范围查询分页结果,要求时间范围包含。
Page findByCtimeBetweenOrderByCtime(LocalDateTime startTime, LocalDateTime endTime, Pageable pageable);
这时候打印的日志为:
find using query: { "ctime" : { "$gt" : { "$date" : 1605682694000 }, "$lt" : { "$date" : 1605682800000 } }
没有包含时间范围的边界,不符合要求
实现一
这个实现很骚,官网有解释:
查询代码:
@Query(value = "{'ctime': {$gte : ?0, $lte : ?1}}")
Page findByCtimeBetweenOrderByCtime(LocalDateTime startTime, LocalDateTime endTime, Pageable pageable);
这时候打印的日志为:
find using query: { "ctime" : { "$gte" : { "$date" : 1605682694000 }, "$lte" : { "$date" : 1605682800000 } }
可以看到,已经包含了时间范围。
实现二
Range timeRange = Range.from(Range.Bound.inclusive(startTime)).to(Range.Bound.inclusive(endTime));
Page page = logRepository.findByCtimeBetweenOrderByCtime(timeRange, pageable);
...
Page findByCtimeBetweenOrderByCtime(Range timeRange, Pageable pageable);
这里的LocalDateTime不支持,因为LocalDateTime实现的Comparable接口中给定的范型参数不是LocalDateTime,不符合参数要求,但是换个查询类型就可以了,比如Integer此类的。
实现三
&#64;Query("select * from Log where ctime >&#61; ?0 and ctime <&#61; ?1")
Page findByCtimeBetweenOrderByCtime(LocalDateTime startTime, LocalDateTime endTime, Pageable pageable);
这种方案我个人不太喜欢&#xff0c;哈哈&#xff0c;就是想用对象&#xff0c;不想写过程查询语句。
参考
Spring DATA JPA Between and IsBetween keywordsstackoverflow.com
Spring Data MongoDB - Reference Documentationdocs.spring.io