JPA query between的多種方式(mongodb為例)
阿新 • • 發佈:2020-11-26
背景
JPA+MongoDB查詢,給定一段時間範圍查詢分頁結果,要求時間範圍包含。
Page<Log> 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<Log> findByCtimeBetweenOrderByCtime(
LocalDateTime startTime, LocalDateTime endTime, Pageable pageable);
這時候列印的日誌為:
find using query: { "ctime" : { "$gte" : { "$date" : 1605682694000 }, "$lte" : { "$date" : 1605682800000 } }
可以看到,已經包含了時間範圍。
實現二
Range<LocalDateTime> timeRange = Range.from(Range.Bound.inclusive(startTime)).to(Range.Bound.inclusive(endTime)); Page<Log> page = logRepository.findByCtimeBetweenOrderByCtime(timeRange, pageable); ... Page<ScheduleLog> findByCtimeBetweenOrderByCtime(Range<LocalDateTime> timeRange, Pageable pageable);
這裡的LocalDateTime不支援,因為LocalDateTime實現的Comparable介面中給定的範型引數不是LocalDateTime,不符合引數要求,但是換個查詢型別就可以了,比如Integer此類的。
實現三
@Query("select * from Log where ctime >= ?0 and ctime <= ?1")
Page<Log> findByCtimeBetweenOrderByCtime(
LocalDateTime startTime, LocalDateTime endTime, Pageable pageable);
這種方案我個人不太喜歡,哈哈,就是想用物件,不想寫過程查詢語句。