java - namedquery - jpa query example
¿Cómo ver las consultas SQL emitidas por JPA? (11)
Además, si está utilizando EclipseLink y desea generar los valores de los parámetros de SQL, puede agregar esta propiedad a su archivo persistence.xml:
<property name="eclipselink.logging.parameters" value="true"/>
Cuando mi código emite una llamada como esta:
entityManager.find(Customer.class, customerID);
¿Cómo puedo ver la consulta SQL para esta llamada? Asumiendo que no tengo acceso al servidor de la base de datos para perfilar / monitorear las llamadas, ¿hay forma de registrar o ver en mi IDE las consultas SQL correspondientes emitidas por las llamadas JPA? Voy contra SQL Server 2008 R2 usando el controlador jTDS.
Ejemplo usando log4j ( src / log4j.xml ):
<?xml version="1.0" encoding="UTF-8" ?>
<appender name="CA" class="org.apache.log4j.AsyncAppender">
<param name="BufferSize" value="512"/>
<appender-ref ref="CA_OUTPUT"/>
</appender>
<appender name="CA_OUTPUT" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%p] %d %c %M - %m%n"/>
</layout>
</appender>
<logger name="org.hibernate.SQL" additivity="false">
<level value="DEBUG"/>
<appender-ref ref="CA"/>
</logger>
<root>
<level value="WARN"/>
<appender-ref ref="CA"/>
</root>
En EclipseLink para obtener el SQL para una consulta específica en tiempo de ejecución, puede usar la API de DatabaseQuery:
Query query = em.createNamedQuery("findMe");
Session session = em.unwrap(JpaEntityManager.class).getActiveSession();
DatabaseQuery databaseQuery = ((EJBQueryImpl)query).getDatabaseQuery();
databaseQuery.prepareCall(session, new DatabaseRecord());
String sqlString = databaseQuery.getSQLString();
Este SQL contendrá? para los parámetros. Para obtener el SQL traducido con los argumentos, necesita un DatabaseRecord con los valores de los parámetros.
DatabaseRecord recordWithValues= new DatabaseRecord();
recordWithValues.add(new DatabaseField("param1"), "someValue");
String sqlStringWithArgs =
databaseQuery.getTranslatedSQLString(session, recordWithValues);
Hay un archivo llamado persistence.xml. Presiona Ctrl + Shift + R y encuéntralo; luego, hay un lugar escrito como showSQL.
Solo ponlo como verdad
No estoy seguro de si el servidor debe iniciarse como modo de depuración. Verifique los SQL creados en la consola.
Las opciones de registro son específicas del proveedor. Necesita saber qué implementación de JPA usa.
Hibernate ( ver aquí ):
<property name = "hibernate.show_sql" value = "true" />
EclipseLink ( ver aquí ):
<property name="eclipselink.logging.level" value="FINE"/>
OpenJPA ( ver aquí ):
<property name="openjpa.Log" value="DefaultLevel=WARN, Runtime=INFO, Tool=INFO, SQL=TRACE"/>
DataNucleus ( ver aquí ):
Establezca la categoría de registro
DataNucleus.Datastore.Native
a un nivel, comoDEBUG
.
Otra buena opción si tiene demasiadas anotaciones y desea colocar solo como un System.out.println()
temporal, puede hacerlo, dependiendo de su proveedor:
CriteriaBuilder criteriaBuilder = getEntityManager().getCriteriaBuilder();
CriteriaQuery<ExaminationType> criteriaQuery = criteriaBuilder.createQuery(getEntityClass());
/* For Hibernate */
System.out.println(getEntityManager().createQuery(criteriaQuery).unwrap(org.hibernate.Query.class).getQueryString());
/* For OpenJPA */
System.out.println(getEntityManager().createQuery(criteriaQuery).unwrap(org.apache.openjpa.persistence.QueryImpl.class).getQueryString());
/* For EclipseLink */
System.out.println(getEntityManager().createQuery(criteriaQuery).unwrap(JpaQuery.class).getSQLString());
Para ver todos los SQL y parámetros en OpenJPA, ponga estos dos parámetros en persistence.xml:
<property name="openjpa.Log" value="DefaultLevel=WARN, Runtime=INFO, Tool=INFO, SQL=TRACE"/>
<property name="openjpa.ConnectionFactoryProperties" value="PrintParameters=true" />
Si desea ver las consultas exactas en conjunto con los valores de los parámetros y los valores de retorno, puede usar un controlador proxy jdbc. Interceptará todas las llamadas jdbc y registrará sus valores. Algunos proxies:
- log4jdbc
- jdbcspy
También pueden proporcionar algunas características adicionales, como la medición del tiempo de ejecución de consultas y la recopilación de estadísticas.
Si utiliza hibernate y logback como registrador, puede usar lo siguiente (muestra solo los enlaces y no los resultados):
<appender
name="STDOUT"
class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} -
%msg%n</pattern>
</encoder>
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
<evaluator>
<expression>return message.toLowerCase().contains("org.hibernate.type") &&
logger.startsWith("returning");</expression>
</evaluator>
<OnMismatch>NEUTRAL</OnMismatch>
<OnMatch>DENY</OnMatch>
</filter>
</appender>
org.hibernate.SQL = DEBUG imprime la consulta
<logger name="org.hibernate.SQL">
<level value="DEBUG" />
</logger>
org.hibernate.type = TRACE imprime los enlaces y normalmente los resultados, que se suprimirán a través del filtro personalizado
<logger name="org.hibernate.type">
<level value="TRACE" />
</logger>
Necesita la dependencia janino (http://logback.qos.ch/manual/filters.html#JaninoEventEvaluator):
<dependency>
<groupId>org.codehaus.janino</groupId>
<artifactId>janino</artifactId>
<version>2.6.1</version>
</dependency>