2008-11-14 7 views
27

Wenn Sie einem benannten SQL-Parameter ein Datum zuweisen, konvertiert Hibernate diese automatisch in die GMT-Zeit. Wie können Sie die aktuelle Serverzeitzone für alle Daten verwenden?Wie kann die Hibernate-Abfrage für die aktuelle Zeitzone Date-Parameter zugewiesen werden?

Lassen Sie uns sagen Sie eine Frage haben:

Query q = session.createQuery("from Table where date_field < :now"); 
q.setDate("now", new java.util.Date()); 

"jetzt" wird auf GMT-Zeit eingestellt werden, während "new Date()" Ihre aktuelle Serverzeit bekommt.

Danke.

Antwort

57

Wie sich herausstellte, konvertiert Hibernate Daten nicht automatisch in GMT, es schneidet nur die Zeit ab, wenn Sie query.setDate() verwenden. Wenn Sie also "2009-01-16 12:13:14" übergeben, wird es "2009-01 -16 00:00:00 ".

Um Zeit in Betracht zu ziehen, müssen Sie stattdessen query.setTimestamp("date", dateObj) verwenden.

+1

Das hat mich auch etwas gebissen. Es hilft nicht, dass in Oracle 'DATE' ein Datum und eine Uhrzeit stehen, die mit' Date' von Java übereinstimmen, während 'TIMESTAMP' ein Datum und eine Uhrzeit mit Mikrosekunden ist. –

+0

Jetzt ist die Methode setTimestamp (String, Date) vom Typ Query veraltet – Maske

+0

Sie gespeichert meinen Tag, danke im Voraus. – VAdaihiep

2

Hibernate kennt keine Zeitzonen. Jede Zeitzonenumwandlung sollte vor dem Ausführen der Abfrage durchgeführt werden. Wenn Ihr Datenbankserver beispielsweise auf CST eingestellt ist, aber der Benutzer sich auf EST befindet, müssen Sie jedem Zeitstempel, der die Eingabe für eine Abfrage darstellt, 1 Stunde hinzufügen.

2

Wir verwenden einen benutzerdefinierten Hibernate-Datumstyp. Jedes Mal, wenn wir einen Parameter für eine Abfrage setzen, verwenden wir eine Basisklasse oder eine Hilfsmethode, um die Zeitzone des Benutzers an den benutzerdefinierten Typparameter zu übergeben.

Sie könnten mit nur manuell die Zeit in der Hilfsmethode für Abfragen anpassen, aber auf diese Weise Daten, die in die Datenbank eingelesen oder geschrieben werden auch korrekt konvertiert werden. Diese Methode behandelt auch die Situation, in der die Datenbank das Datum in seiner lokalen Zeitzone speichert. Selbst wenn Sie einen Benutzer in einer Zeitzone, einen Datenbankserver in einem anderen und Java unter Verwendung von GMT haben, kann es alles klarstellen. Es endet aussehen wie:

Properties properties = new Properties(); 
properties.setProperty("timeZone", databaseTimeZone); 
query.setParameter("from", dateEnteredByUser, Hibernate.custom(LocalizedDateType.class, properties)); 

Als zusätzlichen Bonus, verwenden wir dies mit der Tatsache zu tun, dass SQL Server konvertiert 23: 59: 59.999 auf den nächsten Tag. Im benutzerdefinierten Typ überprüfen wir das und setzen es zurück.

2

Wenn Sie einen timezone synchronisierten Wert, den Sie jetzt verwenden können() in Ihrem HQL. Außerdem empfehle ich Ihnen, die Joda-Bibliothek zu benutzen. Es hat ein Winterschlaf-Modul.