Hibernate muestra SQL real [duplicate]

5 minutos de lectura

Hibernate muestra SQL real duplicate
Tommaso Taruffi

si me fijo

<property name="show_sql">true</property>

en mi hibernate.cfg.xml archivo de configuración en la consola puedo ver el SQL.

Pero no lo es verdadero SQL… ¿Puedo ver el código SQL que se pasará directamente a la base de datos?

Ejemplo:

veo

select this_.code from true.employee this_ where this_.code=?

Puedo ver

select employee.code from employee where employee.code=12

los verdadero SQL?

  • Hibernate usa declaraciones preparadas internamente, por lo que nunca tiene el SQL en un formato en el que los valores estarían incrustados.

    – Narayan

    29 de marzo de 2010 a las 9:20

  • ¿De verdad dice true.employee?

    – Stephen Denné

    29 de marzo de 2010 a las 9:50

  • la única solución de trabajo que he encontrado está aquí: mkyong.com/hibernate/…

    – Christian Acilli

    23 de enero de 2013 a las 17:10

  • Al contrario de lo que está escrito aquí, no he encontrado una respuesta a esta pregunta allí: Imprimir cadena de consulta en hibernación con valores de parámetros.

    – Nicolás Barbulesco

    3 de septiembre de 2013 a las 8:30

  • @NicolasBarbulesco La versión con los signos de interrogación es el SQL real. Todos los controladores JDBC pueden aceptar consultas en este formato. Bajo el capó, el controlador JDBC puede reformatear la consulta para que coincida con el formato de marcador de posición nativo de la base de datos (por ejemplo, Oracle y PostgreSQL reemplazarán ? con :1, :2, etc.), y en algunos casos específicos puede reemplazar los marcadores de posición de enlace con valores escapados (algunos controladores de MySQL hacen esto). Sin embargo, la mayoría de las bases de datos son capaces de manejar consultas con marcadores de posición de forma nativa.

    – James_pic

    21 de enero de 2015 a las 13:58

Hibernate muestra SQL real duplicate
pascal ladrón

¿Puedo ver (…) el SQL real?

Si desea ver el SQL enviado directamente a la base de datos (que está formateado similar a su ejemplo), tendrá que usar algún tipo de proxy de controlador jdbc como P6Espía (o log4jdbc).

Alternativamente, puede habilitar el registro de las siguientes categorías (usando un log4j.properties archivo aquí):

log4j.logger.org.hibernate.SQL=DEBUG
log4j.logger.org.hibernate.type=TRACE

El primero es equivalente a hibernate.show_sql=trueel segundo imprime los parámetros enlazados entre otras cosas.

Referencia

  • Me gusta P6Spy, especialmente cuando ejecuto pruebas unitarias, porque también le dará el conjunto de resultados de su consulta además de los valores de los parámetros de vinculación.

    – elduff

    29 de marzo de 2010 a las 16:59

  • ¿Puedes publicar el ejemplo de salida de registro?

    – Scarlett

    15 de marzo de 2012 a las 8:13

  • @Pascal, no creo que debas decir “Si quieres verlo formateado exactamente como en tu ejemplo” porque depende en gran medida de la base de datos que esté usando y si hibernate elige procesar por lotes/preparar la declaración.

    – Adam Gent

    2 de enero de 2013 a las 21:24


  • Habilitando el org.hibernate.type categoría no funcionó para mí, pero habilitar la org.hibernate.loader.hql en cambio, la categoría funcionó.

    –Emil Lundberg

    13 de febrero de 2015 a las 16:05

  • Es posible que deba decirle a Hibernate qué administrador de registro usa (log4j, slf4j), vea cómo.

    – Vlastimil Ovčáčík

    09/08/2015 a las 18:33

Hibernate muestra SQL real duplicate
Tommaso Taruffi

log4j.propiedades

log4j.logger.org.hibernate=INFO, hb
log4j.logger.org.hibernate.SQL=DEBUG
log4j.logger.org.hibernate.type=TRACE
log4j.logger.org.hibernate.hql.ast.AST=info
log4j.logger.org.hibernate.tool.hbm2ddl=warn
log4j.logger.org.hibernate.hql=debug
log4j.logger.org.hibernate.cache=info
log4j.logger.org.hibernate.jdbc=debug

log4j.appender.hb=org.apache.log4j.ConsoleAppender
log4j.appender.hb.layout=org.apache.log4j.PatternLayout
log4j.appender.hb.layout.ConversionPattern=HibernateLog --> %d{HH:mm:ss} %-5p %c - %m%n
log4j.appender.hb.Threshold=TRACE

hibernate.cfg.xml

<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="use_sql_comments">true</property>

persistencia.xml

Algunos marcos utilizan persistence.xml:

<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.use_sql_comments" value="true"/>

  • ¿Hay alguna manera de que podamos obtener información sobre los parámetros de vinculación en los registros?

    – Raquel

    24 de enero de 2012 a las 18:53

  • @Rachel, ¿qué más que iniciar sesión como TRACE [BasicBinder] binding parameter [1] as [VARCHAR] - john doe ¿necesitas?

    – Arjan

    8 de diciembre de 2012 a las 12:52

  • ¡¡No trabajes en Hibernate 4.3!!

    – reznic

    15 de octubre de 2014 a las 9:18

  • si agregas org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl puede deducir los valores límite de la Releasing statement– o Closing prepared statement-líneas (al menos con H2)

    – El Constructor

    6 mayo 2015 a las 13:50


  • @Arjan Tener los parámetros enumerados por separado realmente no es muy útil. Parte de la razón por la que querría impresiones SQL como esta es para poder ejecutar las declaraciones yo mismo y ver qué está pasando. Tener que extraer e insertar parámetros a mano es simplemente torpe. Es una pena que no haya una forma más simplificada de imprimirlos.

    – Amalgovino

    5 oct 2015 a las 19:49

Si ya puede ver que se imprime el SQL, eso significa que tiene el siguiente código en su hibernate.cfg.xml:

<property name="show_sql">true</property>

Para imprimir también los parámetros de vinculación, agregue lo siguiente a su archivo log4j.properties:

log4j.logger.net.sf.hibernate.type=debug

  • esto se aplica solo a la versión de hibernación <3.0, ¿verdad?

    – Jolly1234

    20 mayo 2015 a las 19:13

  • @Brian: ¿debo ingresar y appenderRef?

    – Karen Goh

    7 de septiembre de 2017 a las 4:28

Vale la pena señalar que el código que ve se envía a la base de datos tal cual, las consultas se envían por separado para evitar la inyección de SQL. AFAIK El? Las marcas son marcadores de posición que son reemplazados por los parámetros numéricos por la base de datos, no por hibernación.

select this_.code from true.employee this_ where this_.code=? es lo que se enviará a su base de datos.

this_ es un alias para esa instancia del employee mesa.

  • El problema no es el Esto sino el ?

    –David Anderson

    18 de abril de 2014 a las 15:02

  • El problema no es el Esto sino el ?

    –David Anderson

    18 de abril de 2014 a las 15:02

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad