2017-08-01 53 views
0

我有一個實體錦標賽如下:春天JPA的方法來找到實體beforeAndEqual日期和afterAndEqual日期

class Tournament { 
    //other attributes 
    private LocalDate startDate; 
    private LocalDate endDate; 
} 

這代表了幾天/數月運行一個比賽,從STARTDATE至ENDDATE。 我需要檢索今天運行的所有錦標賽,在這一刻,像startDate < =今天& & endDate> =今天,使用Spring JPA和分頁。

我發現的最接近是以下幾點:

@Repository 
public interface TournamentRepository extends PagingAndSortingRepository<Tournament, Long> { 

    Page<Tournament> findByStartBeforeAndEndAfter(LocalDate date, LocalDate dateCopy, Pageable page); //today's date is passed as date and dateCopy 

} 

方法調用:

tournamentRepository.findByStartBeforeAndEndAfter(LocalDate.now(), LocalDate.now(), page); 

這可以解釋爲的startDate <今天& &結束日期今天>,所以這是行不通的如果錦標賽今天運行並且僅運行1天。

有沒有更好的方法來使用Spring JPA做到這一點,而無需編寫自定義查詢?

+0

您是否試過'findByStartDateLessThanEqualAndEndDateGreaterThanEqual'? [官方文檔](https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.query-creation)闡明瞭「LessThanEqual」和「GreaterThanEqual」是支持的關鍵字。 – manish

回答

1

CURRENT_DATE,CURRENT_TIMECURRENT_TIMESTAMP是JPA中的預定義函數。你可以使用它。

試試這個

@Repository 
public interface TournamentRepository extends PagingAndSortingRepository<Tournament, Long> { 

    @Query("Select t from Tournament t where t.startDate <= CURRENT_DATE and t.endDate >= CURRENT_DATE") 
    Page<Tournament> findByStartBeforeAndEndAfter(Pageable page); 

} 
1

您可以使用@Query註釋,寫自己的查詢關鍵詞,比如下面的代碼。

@Repository 
    public interface TournamentRepository extends PagingAndSortingRepository<Tournament, Long> { 
     @Query("select t from Tournament t where t.startDate <=:date and t.endDate >=: dateCopy") 
     Page<Tournament> findByStartBeforeAndEndAfter(@Param("date")LocalDate date,@Param("dateCopy") LocalDate dateCopy, Pageable page); //today's date is passed as date and dateCopy 

    } 

您也可以嘗試native query這樣

@Repository 
public interface TournamentRepository extends PagingAndSortingRepository<Tournament, Long> { 
    @Query("select * from tournament where start_date <=:date and end_date >=: dateCopy",nativeQuery=true) 
    List<Tournament> findByStartBeforeAndEndAfter(@Param("date")LocalDate date,@Param("dateCopy") LocalDate dateCopy); //today's date is passed as date and dateCopy 

} 
0

您可以使用每種不超過,GREATERTHAN,LessThanEqual,GreaterThanEqual的日期。

@Repository 
public interface TournamentRepository extends PagingAndSortingRepository<Tournament, Long> { 

    Page<Tournament> findByGreaterThanEqualStartDateAndLessThanEqualEndDate(LocalDate date, LocalDate dateCopy, Pageable page); //today's date is passed as date and dateCopy 

}