Oracle
 sql >> Base de données >  >> RDS >> Oracle

Critères d'hibernation pour les dates

Pourquoi utilisez-vous Restrictions.like(... ) ?

Vous devez utiliser Restrictions.eq(...) .

Notez que vous pouvez également utiliser .le , .lt , .ge , .gt sur les objets de date en tant qu'opérateurs de comparaison. LIKE l'opérateur n'est pas approprié pour ce cas car LIKE est utile lorsque vous souhaitez faire correspondre les résultats en fonction du contenu partiel d'une colonne.Veuillez consulter http://www.sql-tutorial.net/SQL-LIKE.asp pour la référence.

Par exemple, si vous avez une colonne de nom avec le nom complet de certaines personnes, vous pouvez faire where name like 'robert %' afin que vous renvoyiez toutes les entrées dont le nom commence par 'robert ' (% peut remplacer n'importe quel caractère).

Dans votre cas, vous connaissez le contenu complet de la date que vous essayez de faire correspondre, vous ne devez donc pas utiliser LIKE mais égalité. Je suppose que Hibernate ne vous donne aucune exception dans ce cas, mais de toute façon vous aurez probablement le même problème avec le Restrictions.eq(...) .

Votre objet de date que vous avez obtenu avec le code :

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

Cet objet date est égal au 17-04-2011 à 0h, 0 minute, 0 seconde et 0 nanoseconde.

Cela signifie que vos entrées dans la base de données doivent avoir exactement cette date. Ce que je veux dire, c'est que si votre entrée de base de données a une date "17-avril-2011 19:20:23.707000000", alors elle ne sera pas récupérée car vous demandez simplement cette date :"17-avril-2011 00:00 :00.0000000000".

Si vous souhaitez récupérer toutes les entrées de votre base de données d'un jour donné, vous devrez utiliser le code suivant :

    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) );