2012-07-30 11 views
11

Necesito obtener la cadena de una consulta de Hibernate y procesarla más tarde (por lo que no puedo resolverla con "hibernate.show_sql").Obtener SQL String de la consulta de Hibernate

Ya he visto How to get SQL from Hibernate Criteria API (*not* for logging) pero con esa solución obtengo la cadena de consulta SQL pero en lugar de mostrar el valor de los parámetros muestra '?' ... ¿Hay alguna forma de obtener la cadena SQL completa con los valores de los parámetros?

quiero decir, con que la solución llegue "SELECT * FROM USER WHERE NAME=? AND SURNAME=?" pero necesito conseguir "SELECT * FROM USER WHERE NAME='John' AND SURNAME='Doe'" ...

ideas?

+0

¿Marcó alguna de las respuestas? – jelies

Respuesta

1

Hay una herramienta llamada p6spy. Es un poco más viejo y me temo que ya no se mantiene. Me dio buenos resultados en el pasado, de todos modos.

Editar: acabo de descubrir que se está desarrollando activamente de nuevo. ¡Funciona como un encanto para mí!

1

No existe la "cadena SQL completa con los valores de los parámetros".

Hibernate usa sentencias preparadas, por lo tanto, envía cadena de consulta con ? sy valores de parámetros a la base de datos por separado, de modo que la consulta real nunca se construye.

Quizás pueda encontrar la manera de extraer los valores de los parámetros de QueryImpl, pero incluso en este caso no podrá obtener una consulta lista para la ejecución, porque necesitará manejar el escape, conversión de valores de parámetros a SQL literales, etc.

+0

Gracias, temía que no hubiera una solución ... – diminuta

8

Usted tiene que fijar TRACE nivel de registro a este paquete de hibernación y el enlace de parámetros debe mostrar en su registro de aplicación: ejemplo

<category name="org.hibernate.type"> 
     <priority value="TRACE"/> 
</category> 

salida:

13:58:51,505 DEBUG [SQL] 
insert 
     into 
      s.audit 
      (action, e_s, ip, time, userid, id) 
     values 
      (?, ?, ?, ?, ?, ?) 
13:58:51,505 TRACE [StringType] binding 'Modify user' to parameter: 1 
13:58:51,505 TRACE [StringType] binding 'E' to parameter: 2 
13:58:51,505 TRACE [StringType] binding '164.20.81.65' to parameter: 3 
13:58:51,505 TRACE [TimestampType] binding '2012-07-30 13:58:51' to parameter: 4 
13:58:51,505 TRACE [IntegerType] binding '158' to parameter: 5 
13:58:51,505 TRACE [IntegerType] binding '8851' to parameter: 6 

Y no se olvide de la propiedad 'hibernate.show_sql=true' que dijo anteriormente para mostrar también el SQL relacionado.

+0

Eso está bien, pero necesitaba la consulta "completa", como: insertar en los valores de s.audit (action, e_s, ip, time, userid, id) ('Modificar usuario', 'E', '164.20.81.65', '2012-07-30 13:58:51', '158', '8851') ... – diminuta

+0

consulta "completa" como dijiste no es posible , esta es la solución más cercana, creo :( – jelies

+0

Muchas gracias de todos modos: / – diminuta

Cuestiones relacionadas