2011-11-17 9 views
5

Devo selezionare alcune entità utilizzando il filtro HQL entro il tempo. Ma ho bisogno di confrontare solo la componente della data senza tempo. Ad esempio 1.1.2011 12.00 e 1.1.2011 13.20 devono essere uguali.Confronta solo il componente della data in HQL

Quale operatore è possibile utilizzare?

@Query("FROM Item item " + 
    "WHERE item.date [equality by date operator] :date ") 
List<Item> findByDate(@Param("date") Date date); 

risposta

8

Se non ti dispiace le funzioni specifiche del DB, potresti farlo (utilizzando Oracle come esempio).

@Query("FROM Item item WHERE trunc(item.date) = trunc(:date) ") 
List<Item> findByDate(@Param("date") Date date); 

È possibile utilizzare questo perché l'OracleDialect registra trunc come StandardSQLFunction e Oracle di TRUNC rimuove la componente temporale di una data.

+0

In Oracle per evitare errori è possibile chiamare 'trunc (item.date,'YYYY ')' per evitare alcuni errori. –

9

Se fate mente le funzioni DB-specifici (e si dovrebbe) quindi lavorare con 2 date:

  1. dalla data = data con il tempo impostato a mezzanotte
  2. ad oggi = Data con il tempo impostato 23: 59: 59,999

quindi eseguire una query per le date di> = da data e < = ad oggi

+0

Sto usando oracle db ed è meglio usare il trunc. Tnx per la nostra risposta – hatesms

+3

Bene, ma se vuoi testare con un DB in memoria dove questo non è supportato sarai bloccato. –

0
"Select col from Table t where t.date = CURRENT_DATE()" 

prova questo.

Problemi correlati