1. 程式人生 > 資料庫 >JPA query between的多種方式(mongodb為例)

JPA query between的多種方式(mongodb為例)

背景

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);

這種方案我個人不太喜歡,哈哈,就是想用物件,不想寫過程查詢語句。

參考