Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Hibernate-Kriterien für Dates

Warum verwenden Sie Restrictions.like(... )?

Sie sollten Restrictions.eq(...) verwenden .

Beachten Sie, dass Sie auch .le verwenden können , .lt , .ge , .gt auf Datumsobjekten als Vergleichsoperatoren. LIKE Operator ist für diesen Fall nicht geeignet, da LIKE ist nützlich, wenn Sie Ergebnisse anhand des Teilinhalts einer Spalte abgleichen möchten. Siehe http://www.sql-tutorial.net/SQL-LIKE.asp für die Referenz.

Wenn Sie beispielsweise eine Namensspalte mit dem vollständigen Namen einiger Personen haben, können Sie where name like 'robert %' verwenden sodass Sie alle Einträge zurückgeben, deren Name mit 'robert ' beginnt (% kann jedes Zeichen ersetzen).

In Ihrem Fall kennen Sie den vollständigen Inhalt des Datums, das Sie zuzuordnen versuchen, also sollten Sie LIKE nicht verwenden sondern Gleichberechtigung. Ich denke, Hibernate gibt Ihnen in diesem Fall keine Ausnahme, aber Sie werden wahrscheinlich trotzdem das gleiche Problem mit der Restrictions.eq(...) haben .

Ihr Datumsobjekt erhalten Sie mit dem Code:

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

Dieses Datumsobjekt entspricht dem 17.04.2011 um 0 Uhr, 0 Minuten, 0 Sekunden und 0 Nanosekunden.

Das bedeutet, dass Ihre Einträge in der Datenbank genau haben müssen dieses Datum. Was ich meine ist, dass, wenn Ihr Datenbankeintrag ein Datum "17-April-2011 19:20:23.707000000" hat, er nicht abgerufen wird, weil Sie nur nach diesem Datum fragen:"17-April-2011 00:00:00.000000000".

Wenn Sie alle Einträge Ihrer Datenbank von einem bestimmten Tag abrufen möchten, müssen Sie den folgenden Code verwenden:

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