2013-08-06 12 views
9

Ho questo modello di datiprimavera dati Interrogazione DateTime con unica data

public class CustomerModel{ 

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

E la seguente repo

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

Quello che voglio fare è. Recupera tutti gli utenti in una determinata data, ad es. (Membri che hanno aderito al 1 ° agosto 2013), tuttavia il problema è che sul mio DB l'abbonamento ha un tempo con esso. come posso ignorare il tempo e recuperare tutti gli utenti in una determinata data?

risposta

28

Sfortunatamente con JodaTime l'unico modo per aggirare questo è utilizzare la parola chiave Between e utilizzare due istanze DateTime che compongono il giorno.

interface CustomerRepo extends Repository<CustomerModel, Long>{ 

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

Se il modello di dominio utilizzato Java Date s internamente si potrebbe aver usato questo stile:

interface CustomerRepo extends Repository<CustomerModel, Long>{ 

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

Non il @Temporal annotazione è una consuetudine primavera dati JPA uno come la piana APP non è attualmente consentito sui parametri. La ragione per cui funziona solo con Java Date s è purtroppo una limitazione degli attuali JPAPI. Il metodo setParameter(…) su richiede solo un TemporalType per i parametri di tipo Date. Potremmo provare a convertire gli oggetti JodaTime sul binding dei parametri, ma suppongo che i provider di persistenza rigetteranno quello a causa della mancata corrispondenza del tipo (Date VS. DateTime).

+2

Nella v1.6.2 dei dati di primavera questa annotazione supporta solo i parametri di tipo java.util.Date. In quanto tale, questa soluzione attualmente non funziona per confrontare gli oggetti DateTime. I javadoc correnti si trovano [qui] (http://docs.spring.io/spring-data/jpa/docs/current/api/org/springframework/data/jpa/repository/Temporal.html). – yurodivuie

+0

@yurodivuie - Questa è una bella cattura. Grazie per il puntatore. Ho aggiornato la risposta per fornire una soluzione alternativa per JodaTime e delineando perché questo attualmente funziona solo con i tipi Java Date. –

+0

E a proposito di Java 8 ZonedDateTime nell'entità e LocalDate come parametro di ricerca? –

3

È possibile eseguire qualche soluzione: creare DateTime dayBegin e DateTime dayEnd che sono ad es. 2013-07-04 00:00:00 e 2013-07-04 23:59:59 a prendere oggetti necessari per query:

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

È necessario utilizzare la funzione DATA

Confronta due date e ignora il tempo

WHERE DATE(dbdDate) = DATE(yourDate) 
Problemi correlati