Oracle
 sql >> Database >  >> RDS >> Oracle

Criteri di ibernazione per le date

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

Dovresti usare Restrictions.eq(...) .

Nota che puoi anche usare .le , .lt , .ge , .gt su oggetti data come operatori di confronto. LIKE operatore non è appropriato per questo caso poiché LIKE è utile quando si desidera abbinare 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 del nome con il nome completo di alcune persone, puoi fare where name like 'robert %' in modo da restituire tutte le voci il cui nome inizia con 'robert ' (% può sostituire qualsiasi carattere).

Nel tuo caso conosci l'intero contenuto 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 oggetto data che hai ricevuto con il codice:

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

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

Ciò significa che le tue voci nel database devono avere esattamente quella data. Quello che voglio dire è che se la voce del tuo database ha una data "17-April-2011 19:20:23.707000000", non verrà recuperata perché chiedi semplicemente quella data:"17-April-2011 00:00:00.0000000000".

Se vuoi recuperare tutte le voci del tuo database di un determinato giorno, dovrai utilizzare 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) );