it-swarm.com.de

Wie werden der Hibernate-Abfrage für die aktuelle Zeitzone Date-Parameter zugewiesen?

Wenn Sie einem benannten SQL-Parameter ein Datum zuweisen, wandelt Hibernate dieses Datum automatisch in GMT-Zeit um. Wie kann die aktuelle Server-Zeitzone für alle Daten verwendet werden?

Nehmen wir an, Sie haben eine Anfrage:

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

"now" wird auf GMT-Zeit eingestellt, während "new Date ()" Ihre aktuelle Serverzeit abruft.

Vielen Dank.

29
serg

Wie sich herausgestellt hat, konvertiert Hibernate Datumsangaben nicht automatisch in GMT, wird die Zeit bei Verwendung von query.setDate() nur verkürzt. Wenn Sie "2009-01-16 12:13:14" übergeben, wird "2009-01-16 00" angezeigt: 00:00 ". 

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

60
serg

Wenn Sie einen timeZone synchronized-Wert benötigen, können Sie now () in Ihrem HQL verwenden. Ich schlage auch vor, die Joda-Bibliothek zu verwenden. Es verfügt über ein Hibernate-Plugin-Modul.

2
Maksim

Hibernate kennt keine Zeitzonen. Jede Zeitzonenumwandlung sollte vor dem Ausführen der Abfrage durchgeführt werden. 

Wenn Ihr Datenbankserver beispielsweise auf CST eingestellt ist, der Benutzer jedoch auf EST eingestellt ist, müssen Sie allen Zeitstempeln, die die Eingabe einer Abfrage darstellen, eine Stunde hinzufügen. 

2
Clay

Wir verwenden einen benutzerdefinierten Hibernate-Datentyp. Jedes Mal, wenn wir einen Parameter für eine Abfrage festlegen, verwenden wir eine Basisklassen- oder Dienstprogrammmethode, damit wir die Zeitzone des Benutzers an den benutzerdefinierten Typparameter übergeben können. 

Sie könnten es schaffen, die Zeit in der Utility-Methode für Abfragen lediglich manuell anzupassen, aber auf diese Weise werden Datumsangaben, die in die Datenbank eingelesen oder in die Datenbank geschrieben werden, ebenfalls korrekt konvertiert. Diese Methode behandelt auch die Situation, in der die Datenbank das Datum in ihrer lokalen Zeitzone speichert. Selbst wenn Sie einen Benutzer in einer Zeitzone, einen Datenbankserver in einem anderen und Java mit GMT haben, kann dies alles klarstellen. Es sieht so aus:

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

Als zusätzlichen Bonus verwenden wir dies, um mit der Tatsache umzugehen, dass SQL Server 23: 59: 59.999 in den nächsten Tag konvertiert. Im benutzerdefinierten Typ überprüfen wir das und machen es rückgängig.

2
Brian Deterling

Hibernate-Team hatsetTimestamp (String-Name, Datumswert)-Methode sowie org.hibernate.Query interface seit Version5.2veraltet.

 /* @deprecated (since 5.2) use {@link #setParameter(int, Object)} or
    {@link #setParameter(int, Object, Type)}  instead
 */

So können Sie folgenden Code verwenden:

import org.hibernate.query.Query;
...
Query query = session.createQuery("from Table where date_field < :now");
query.setParameter("now", new Date(), TimestampType.INSTANCE );

Es ist bemerkenswert, dass diesetDate- Methode, die den Zeitanteil verkürzt, ebenfalls veraltet ist und durch diese Option (von derselben Schnittstelle org.hibernate.query.Query) ersetzt werden kann:

query.setParameter("firstMomentOfToday", new Date(), DateType.INSTANCE);
1
Kayvan Tehrani