Criteri di sospensione per le date

In Oracle ho date in formato

17 aprile 2011 19: 20: 23.707000000

Vorrei recuperare tutti gli ordini per il 17-04-2011.

SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-YYYY"); String myDate = "17-04-2011"; Date date = formatter.parse(myDate); Criteria criteria = session.createCriteria(Order.class); Criterion restrictDate = Restrictions.like("orderDate",date); 

ma mi porta risultato vuoto:

Perché usi Restrictions.like(... )?

Dovresti usare Restrictions.eq(...) .

Nota: puoi anche usare .le , .lt , .ge , .gt sugli oggetti data come operatori di confronto. LIKE operatore LIKE non è appropriato per questo caso poiché LIKE è utile quando si desidera confrontare i risultati in base al contenuto parziale di una colonna. Si prega di consultare http://www.sql-tutorial.net/SQL-LIKE.asp per il riferimento.

Ad esempio, se hai una colonna nome con il nome completo di alcune persone, puoi fare il where name like 'robert %' modo che tu possa restituire tutte le voci con nome che inizia con 'robert ' ( % può sostituire qualsiasi carattere).

Nel tuo caso conosci il contenuto completo della data che stai cercando di abbinare, quindi non dovresti usare LIKE ma uguaglianza. Immagino che Hibernate non ti dia alcuna eccezione in questo caso, ma comunque probabilmente avrai lo stesso problema con Restrictions.eq(...) .

Il tuo object data che hai ottenuto con il codice:

 SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-YYYY"); String myDate = "17-04-2011"; Date date = formatter.parse(myDate); 

Questo object data è uguale al 17-04-2011 a 0h, 0 minuti, 0 secondi e 0 nanosecondi.

Ciò significa che le voci nel database devono avere esattamente quella data. Quello che voglio dire è che se la tua voce di database ha una data “17-April-2011 19: 20: 23.707000000”, quindi non verrà recuperata perché basta chiedere quella data: “17-aprile-2011 00:00: 00,0000000000” .

Se vuoi recuperare tutte le voci del tuo database da un dato giorno, dovrai usare il seguente codice:

  SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-YYYY"); String myDate = "17-04-2011"; // Create date 17-04-2011 - 00h00 Date minDate = formatter.parse(myDate); // Create date 18-04-2011 - 00h00 // -> We take the 1st date and add it 1 day in millisecond thanks to a useful and not so known class Date maxDate = new Date(minDate.getTime() + TimeUnit.DAYS.toMillis(1)); Conjunction and = Restrictions.conjunction(); // The order date must be >= 17-04-2011 - 00h00 and.add( Restrictions.ge("orderDate", minDate) ); // And the order date must be < 18-04-2011 - 00h00 and.add( Restrictions.lt("orderDate", maxDate) ); 

Utilizzando in questo modo è ansible ottenere l’elenco dei record selezionati.

 GregorianCalendar gregorianCalendar = new GregorianCalendar(); Criteria cri = session.createCriteria(ProjectActivities.class); cri.add(Restrictions.ge("EffectiveFrom", gregorianCalendar.getTime())); List list = cri.list(); 

Tutti i record verranno generati in un elenco che è maggiore o uguale a ’08 -Oct-2012 ‘oppure passano la data della data di accettazione dell’utente al 2 ° parametro di Restrizioni ( gregorianCalendar.getTime() ) dei criteri per ottenere i record.

Se la colonna è un timestamp puoi fare quanto segue:

  if(fromDate!=null){ criteria.add(Restrictions.sqlRestriction("TRUNC(COLUMN) >= TO_DATE('" + dataFrom + "','dd/mm/yyyy')")); } if(toDate!=null){ criteria.add(Restrictions.sqlRestriction("TRUNC(COLUMN) <= TO_DATE('" + dataTo + "','dd/mm/yyyy')")); } resultDB = criteria.list();