2011-06-08 8 views
11

¿Puedo saber cómo puedo obtener el sql de una consulta JPA? o digamos, ¿convertir la consulta JPA en una cadena SQL? ¡Muchas gracias!¿Puedo obtener la cadena SQL de un objeto de consulta JPA?

+0

¿Puede ser un poco más explícito sobre lo que quiere exactamente? es decir, publique la "consulta JPA" (consulta de criterios? JPQL?) y tal vez un ejemplo de qué tipo de resultado esperaría. Indíquenos también qué implementación de JPA utiliza (OpenJPA, Hibernate, etc.) –

+0

Para la implementación de hibernación: query.unwrap (org.hibernate.Query.class) .getQueryString(). –

Respuesta

6

Si sólo desea saber cómo su JPQL o criterios de consulta se traduce al dialecto SQL de la base de datos puede habilitar el registro de grano fino en el xml persistencia y luego buscar en los archivos de registro.

El nombre y el valor de la propiedad dependen de la implementación de su JPA. Aquí está un ejemplo de la parte pertinente del persistence.xml para EclipseLink:

<properties> 
    <property name="eclipselink.logging.level" value="FINEST"/> 
</properties> 
2

Probablemente esté interesado si hay una forma de 'extraer' cadena JPQL (con marcadores de posición para params o JPQL final después de que se completen los parámetros) fuera de javax.persistence.Query (una de sus posibles subclases es más preciso), - en este caso no es posible según el contrato de especificación JPA. Sin embargo, esto hipotéticamente podría ser posible mediante la implementación de JPA (por ejemplo, NamedQueryImpl podría tener #toJPQLString(), que se podía acceder a través del casting), pero lo dudo. E incluso si es posible, no creo que sea un buen código para realizar tales manipulaciones. Sugeriría encontrar otras soluciones de diseño (y para eso podrías especificar qué tipo de problema real tienes). Por ejemplo, si está creando sus consultas dinámicamente, la API de criterios de JPA podría utilizarse para eso, y junto con la 'creación' de consultas JPA, podría mantener su estructura interna de datos reflejando la lógica de su consulta.

3

lado que permite el registro como práctico @ Matt mencionó también es posible obtener la cadena SQL para una consulta específica con EclipseLink en tiempo de ejecución como se describe here.

1

usando Hibernate como proveedor puede activar las siguientes propiedades:

hibernate.show_sql 

Escribir todas las sentencias SQL a la consola. Esta es una alternativa a la configuración de la categoría de registro org.hibernate.SQL para depurar. (por ejemplo, verdadero | falso)

hibernate.format_sql 

Impresionante imprimir el SQL en el registro y la consola. (Por ejemplo true | false)

O, como se ha dicho más arriba, puede habilitar el registro a nivel de depuración para el registrador

org.hibernate.SQL 

registrar todas las sentencias SQL DML medida que se ejecutan

8

Para EclipseLink: puede extraer el SQL de la siguiente manera:

query.unwrap(EJBQueryImpl.class).getDatabaseQuery().getSQLString() 

Funciona solo después de la consulta se ha ejecutado.

+1

Funcionó para mí, pero mi proyecto no tenía EJBQueryImpl.class (utilicé String rtn = query.unwrap (org.hibernate.Query.class) .getQueryString();) – John

2

Tras la respuesta de Karol - Es posible recuperar el SQL antes de ejecutar la instrucción en EclipseLink:

Session session = em.unwrap(JpaEntityManager.class).getActiveSession(); 
DatabaseQuery databaseQuery = query.unwrap(EJBQueryImpl.class).getDatabaseQuery(); 
databaseQuery.prepareCall(session, new DatabaseRecord()); 
Record r = databaseQuery.getTranslationRow(); 
String bound = databaseQuery.getTranslatedSQLString(session, r); 
String sqlString = databaseQuery.getSQLString(); 

Para recuperar la cadena SQL Durante/Después de la ejecución es probablemente la mejor manera de hacerlo a través de propiedades de persistencia en lugar de en código:

<property name="eclipselink.logging.parameters" value="true"/> 
<property name="eclipselink.logging.level" value="FINE"/> 
Cuestiones relacionadas