2013-08-06 46 views
9

我有這個數據模型春數據查詢日期時間只有日期

public class CustomerModel{ 

    @Column 
    @Type(type="org.joda.time.contrib.hibernate.PersistentDateTime") 
    private DateTime membershipDate; 
    //Other properties and getters 
} 

而下面的回購

public interface CustomerRepo extends Repository<CustomerModel, Long>{} 

我想要做的是。檢索給定日期的所有用戶,例如(2013年8月1日加入的成員),但問題是在我的DB上,membershipDate有一段時間。我怎麼能忽略時間和檢索給定日期的所有用戶?

回答

28

不幸的是,與JodaTime有關的唯一方法是使用Between關鍵字並使用兩個DateTime實例組成當天。

interface CustomerRepo extends Repository<CustomerModel, Long>{ 

    List<CustomerModel> findByMemberShipDateBetween(DateTime start, DateTime end); 
} 

如果使用的Java Date你的域模型內部就是你可能已經使用這種風格:

interface CustomerRepo extends Repository<CustomerModel, Long>{ 

    List<CustomerModel> findByMemberShipDate(@Temporal(TemporalType.DATE) Date date); 
} 

不是@Temporal註釋是一個自定義的春天JPA的數據作爲一個普通的JPA一個目前不允許參數。這僅適用於Java Date的原因很不幸是當前JPAPI的限制。在Query上的setParameter(…)方法僅需要TemporalType用於Date類型的參數。我們可以嘗試在參數綁定上轉換JodaTime對象,但是我想持久化提供者會因爲類型不匹配而拒絕(Date VS. DateTime)。

+2

在spring-data的v1.6.2中,此註釋僅支持java.util.Date類型的參數。因此,此解決方案目前不適用於比較DateTime對象。當前的javadocs位於[here](http://docs.spring.io/spring-data/jpa/docs/current/api/org/springframework/data/jpa/repository/Temporal.html)。 – yurodivuie

+0

@yurodivuie - 這是一個偉大的捕獲。感謝指針。我更新了答案,爲JodaTime提供了一個替代解決方案,並概述了爲什麼它目前僅適用於Java Date類型。 –

+0

實體中的Java 8 ZonedDateTime和作爲搜索參數的LocalDate如何? –

3

你可以做一些解決方法:創建DateTime dayBegin和DateTime dayEnd,例如通過查詢2013年7月4日00:00和2013年7月4日23:59:59,並獲取需要的對象:

List<CustomerModel> findByMembershipBetween(DateTime dayBegin, DateTime dayEnd); 
-4

您需要使用DATE函數

比較兩個日期並忽略時間

WHERE DATE(dbdDate) = DATE(yourDate)