Hacer que la función convert_tz de MySQL funcione en una base de datos H2.
Estoy escribiendo una prueba en una base de datos en memoria bajo un H2 que utiliza el dialecto de MySQL (org.hibernate.dialect.MySQL5InnoDBDialect
), ya que lo utilizamos en producción.
En uno de los repositorios tenemos una consulta personalizada con el siguiente bloque:
DATE(CONVERT_TZ(NOW(), 'GMT', (:timezoneOffset)))
Sin embargo, H2 arroja el siguiente error:
org.h2.jdbc.JdbcSQLSyntaxErrorException: Función "convert_tz" no encontrada;
Intenté las soluciones sugeridas en esta publicación:
https://stackoverflow.com/questions/31725820/how-to-use-the-mysql-convert-tz-function-in-a-jpql-or-hql-query/31741171
También intenté con un SQLFunctionTemplate
como se muestra en estos ejemplos: https://www.tabnine.com/code/java/methods/org.hibernate.boot.MetadataBuilder/applySqlFunction
Pero sigo obteniendo el mismo error exacto. No veo ninguna otra solución alternativa para hacer que funcione. Cualquier ayuda sería apreciada.
davy.ai
Solución para la base de datos en memoria H2 con consulta personalizada utilizando el dialecto de MySql
Si estás escribiendo una prueba bajo una base de datos en memoria H2 que utiliza el dialecto de MySql (
org.hibernate.dialect.MySQL5InnoDBDialect
) y te encuentras con un error como “Function ‘convert_tz’ not found” al ejecutar una consulta personalizada con el bloque:DATE(CONVERT_TZ(NOW(),'GMT', (:timezoneOffset)))
Existen algunas soluciones para este problema:
Solución 1:
Como se sugiere en esta publicación, puedes intentar lo siguiente:
Dialect
personalizado para la base de datos H2 en memoria, que mapee las funciones específicas de MySql a las funciones equivalentes de H2. Aquí tienes un ejemplo:CustomH2Dialect
para la configuración de tu base de datos H2 en memoria:Solución 2:
También puedes intentar usar un
SQLFunctionTemplate
, como se muestra en este ejemplo:Solución 3:
Alternativamente, puedes intentar usar una función específica de H2, como
CURRENT_TIMESTAMP()
, en lugar de la funciónNOW()
específica de MySql. Aquí tienes un ejemplo:Esperemos que una de estas soluciones te ayude a resolver el problema.