Mostrando entradas con la etiqueta Hibernate. Mostrar todas las entradas
Mostrando entradas con la etiqueta Hibernate. Mostrar todas las entradas

jueves, 28 de mayo de 2009

Obtener la SQL generada por una Criteria de Hibernate en runtime

Recientemente he necesitado obtener la consulta SQL que genera una Criteria de Hibernate en tiempo de ejecución. La primera opción, obviamente, es leer la documentación de Hibernate Criteria, pero Hibernate no posee ninguna funcionalidad para obtener la SQL en su clase Criteria, ni en las clases relacionadas. Esto me resulto extraño, dado que con Hibernate Criteria se pueden volcar las consultas al log usando por ejemplo log4j, para ello hay que:
  • Asignar el valor "true" a la propiedad "hibernate.show_sql" en el sessionFactory.
  • Añadir en el fichero de configuración del log4j dos appenders:
    1. org.hibernate.SQL = DEBUG --> Para ver las consultas.
    2. org.hibernate.type = TRACE --> Para ver los valores de los parámetros.
Dado que la información está almacenada dentro de la Criteria, tan solo es necesario "sacarla", y para ello usaremos la introspección de Java. El código para obtener la consulta SQL con sus parámetros es el siguiente:

Como vemos en el código usamos la introspección para inspeccionar el contenido de algunos atributos privados del Loader y así obtener la información que queremos.

Tengo que decir que esta forma de utilizar las criterias e Hibernate no es muy ortodoxa, y que en caso de usarse debe hacerse de forma muy controlada, no debe ser una práctica habitual, ya que nada nos asegura el correcto funcionamiento de este tipo de artificios. Eso si por una necesidad imperiosa necesitamos obtener la consulta SQL que genera en tiempo de ejecución es un alternativa.

miércoles, 1 de abril de 2009

Vistas materializadas en Hibernate

Recientemente he descubierto las posibilidades de una característica de Hibernate que puede parecer obvia para todos aquellos usuarios avanzados, pero que no lo es tanto y que además puede pasarse por alto fácilmente en la documentación.

Hibernate permite crear vistas de datos (una query precalculada) en el mapping de un objeto, pero la gran virtud que le encuentro a este mecanismo es la posibilidad de crear vistas materializadas (en Oracle se llama así), que no es otra cosa sino una vista de datos que crea una tabla que se actualiza al trabajar con la vista.

En el mapping podemos definir la vista como una consulta SQL en el tag subselect y user el tag synchronize para definir las tablas con las que sincronizaremos la vista.

Veamos un ejemplo extraido de la documentación de hibernate (apartado 5.1.3)