Cuando mi código emite una llamada como esta:
entityManager.find(Customer.class, customerID);
¿Cómo puedo ver la consulta SQL para esta llamada? Suponiendo que no tengo acceso al servidor de base de datos para perfilar / monitorear las llamadas, ¿hay alguna forma de registrar o ver dentro de mi IDE las consultas SQL correspondientes emitidas por llamadas JPA? Voy en contra de SQL Server 2008 R2 usando el controlador jTDS.
Respuestas:
Las opciones de registro son específicas del proveedor. Necesita saber qué implementación de JPA utiliza.
Hibernate ( ver aquí ):
EclipseLink ( ver aquí ):
OpenJPA ( ver aquí ):
DataNucleus ( ver aquí ):
Establezca la categoría de registro
DataNucleus.Datastore.Native
a un nivel, comoDEBUG
.fuente
Además, si está utilizando EclipseLink y desea generar los valores de los parámetros SQL, puede agregar esta propiedad a su archivo persistence.xml:
fuente
Si usa hibernate y logback como su registrador, podría usar lo siguiente (muestra solo los enlaces y no los resultados):
org.hibernate.SQL = DEBUG imprime la consulta
org.hibernate.type = TRACE imprime los enlaces y normalmente los resultados, que se suprimirán a través del filtro personalizado
Necesita la dependencia de janino (http://logback.qos.ch/manual/filters.html#JaninoEventEvaluator):
fuente
En EclipseLink para obtener el SQL para una consulta específica en tiempo de ejecución, puede usar la API DatabaseQuery:
Este SQL contendrá? para los parámetros Para traducir el SQL con los argumentos, necesita un DatabaseRecord con los valores de los parámetros.
Fuente: Cómo obtener el SQL para una consulta
fuente
Para ver todos los SQL y parámetros en OpenJPA, coloque estos dos parámetros en persistence.xml:
fuente
Si desea ver las consultas exactas con valores de parámetros y valores de retorno, puede usar un controlador proxy jdbc. Interceptará todas las llamadas jdbc y registrará sus valores. Algunos proxies:
También pueden proporcionar algunas características adicionales, como medir el tiempo de ejecución de consultas y recopilar estadísticas.
fuente
Ejemplo usando log4j ( src \ log4j.xml ):
fuente
He hecho una hoja de trucos que creo que puede ser útil para otros. En todos los ejemplos, puede eliminar la
format_sql
propiedad si desea mantener las consultas registradas en una sola línea (sin impresión bonita).Imprima bastante las consultas SQL para estandarizar sin parámetros de declaraciones preparadas y sin optimizaciones de un marco de registro :
application.properties
expediente:application.yml
expediente:Imprima consultas SQL con parámetros de declaraciones preparadas utilizando un marco de registro :
application.properties
expediente:application.yml
expediente:Imprima consultas SQL sin parámetros de declaraciones preparadas utilizando un marco de registro :
application.properties
expediente:application.yml
expediente:Fuente (y más detalles): https://www.baeldung.com/sql-logging-spring-boot
fuente
Además, si usa WildFly / JBoss, establezca el nivel de registro de org.hibernate en DEBUG
fuente
Otra buena opción si tiene demasiado registro y desea colocar solo como temporal
System.out.println()
, puede, según su proveedor:fuente
Si está utilizando Spring Framework. Modifique su archivo application.properties como se muestra a continuación
fuente
Consulte No se puede hacer que la hibernación deje de mostrar SQL utilizando Spring JPA Vendor Adapter
fuente
Con Spring Boot simplemente agregue: spring.jpa.show-sql = true a application.properties. Esto mostrará la consulta pero sin los parámetros reales (¿verá? En lugar de cada parámetro).
fuente
Durante el desarrollo exploratorio, y para enfocar el registro de depuración de SQL en el método específico que quiero verificar, decoro ese método con las siguientes declaraciones de registrador:
fuente
EclipseLink para generar el SQL (persistence.xml config):
fuente
Hay un archivo llamado persistence.xml Presione Ctrl + Shift + R y encuéntrelo, luego, hay un lugar escrito como showSQL.
Solo ponlo como cierto
No estoy seguro de si el servidor debe iniciarse como modo de depuración. Verifique los SQL creados en la consola.
fuente