2008-11-14 8 views
27

Cuando asigna una fecha a un parámetro SQL con nombre, 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?¿Cómo asignar los parámetros de Fecha a Hibernar consulta para la zona horaria actual?

Digamos que tiene una consulta:

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

"ahora" se ajustará a la hora GMT, mientras que "new Date()" recibe su hora actual del servidor.

Gracias.

Respuesta

57

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) en su lugar.

+1

Esto también me mordió a mí también. No ayuda que en Oracle 'DATE' sea una fecha y hora que coincida con' Date' de Java, mientras que 'TIMESTAMP' es una fecha y hora con microsegundos. –

+0

Ahora el método setTimestamp (String, Date) del tipo Query está en desuso – Maske

+0

Has guardado mi día, gracias de antemano. – VAdaihiep

2

Hibernate ignora las zonas horarias. Cualquier conversión de zona horaria debe hacerse antes de ejecutar la consulta.

P. ej., 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.

2

Utilizamos 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 obtenerlo simplemente ajustando manualmente la hora en el método de utilidad para 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. Se termina pareciéndose a:

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

Como un beneficio adicional, usamos esta para hacer frente al hecho de que SQL Server convierte 23: 59: 59.999 al día siguiente. En el tipo personalizado, verificamos eso y lo cancelamos.

2

Si necesita un timeZone valor sincronizado puede utilizar ahora () en su HQL. También te sugiero que uses la biblioteca Joda. Tiene un módulo de complemento de hibernación.

Cuestiones relacionadas