java - localdatetime - jpa localtime
¿Cómo asignar los parámetros de Fecha a Hibernar consulta para la zona horaria actual? (5)
Cuando asigna una fecha a un parámetro de SQL nombrado, Hibernate lo convierte automáticamente a la hora GMT. ¿Cómo se hace para usar la zona horaria del servidor actual para todas las fechas?
Digamos que tienes una consulta:
Query q = session.createQuery("from Table where date_field < :now");
q.setDate("now", new java.util.Date());
"ahora" se configurará a la hora GMT, mientras que "nueva fecha ()" obtendrá su hora actual del servidor.
Gracias.
Al final resultó que Hibernate no convierte las fechas a GMT automáticamente, simplemente corta el tiempo si usa query.setDate()
, por lo que si pasa "2009-01-16 12:13:14" se convierte en "2009-01 -16 00:00:00 ".
Para tener en cuenta el tiempo, necesita usar query.setTimestamp("date", dateObj)
lugar.
El equipo de Hibernate ha dejado de utilizar el método setTimestamp (String name, Date val) así como también la interfaz org.hibernate.Query desde la versión 5.2 :
/* @deprecated (since 5.2) use {@link #setParameter(int, Object)} or
{@link #setParameter(int, Object, Type)} instead
*/
Entonces puede usar el siguiente código:
import org.hibernate.query.Query;
...
Query query = session.createQuery("from Table where date_field < :now");
query.setParameter("now", new Date(), TimestampType.INSTANCE );
Es notable que el método setDate que reduce la porción de tiempo también está en desuso y puede ser reemplazado con esta opción (desde la misma interfaz org.hibernate.query.Query):
query.setParameter("firstMomentOfToday", new Date(), DateType.INSTANCE);
Hibernate ignora las zonas horarias. Cualquier conversión de zona horaria debe hacerse antes de ejecutar la consulta.
Por ejemplo, si su servidor de base de datos está configurado en CST, pero el usuario está en EST, necesitará agregar 1 hora a las marcas de tiempo que son la entrada de una consulta.
Si necesita un valor sincronizado timeZone , puede usar now () en su HQL. También te sugiero que uses la biblioteca Joda. Tiene un módulo de complemento de hibernación.
Usamos un tipo de fecha Hibernate personalizado. Cada vez que establecemos un parámetro en una consulta usamos una clase base o un método de utilidad para que podamos pasar la zona horaria del usuario en el parámetro de tipo personalizado.
Puede salir adelante simplemente ajustando manualmente el tiempo en el método de utilidad para las consultas, pero de esta forma las fechas que se leen o escriben en la base de datos también se convierten correctamente. Este método también maneja la situación donde la base de datos almacena la fecha en su zona horaria local. Entonces, incluso si tiene un usuario en una zona horaria, un servidor de base de datos en otra y Java usando GMT, puede hacerlo todo correctamente. Termina pareciéndose a:
Properties properties = new Properties();
properties.setProperty("timeZone", databaseTimeZone);
query.setParameter("from", dateEnteredByUser, Hibernate.custom(LocalizedDateType.class, properties));
Como una ventaja adicional, usamos esto para lidiar con el hecho de que SQL Server convierte 23: 59: 59.999 al día siguiente. En el tipo personalizado, verificamos eso y lo cancelamos.