¿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?
Respuesta
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>
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.
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.
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
Este blog contiene instrucciones : http://narcanti.keyboardsamurais.de/hibernate-hql-to-sql-translation.html
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.
Funcionó para mí, pero mi proyecto no tenía EJBQueryImpl.class (utilicé String rtn = query.unwrap (org.hibernate.Query.class) .getQueryString();) – John
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"/>
- 1. Consulta JPA - inyección sql en parámetros posicionales jpa consulta nativa
- 2. ¿Cómo puedo obtener el SQL de un objeto de consulta en ColdFusion?
- 3. Obtener la cadena de consulta de URLReferrer
- 4. ¿Consulta recursiva de JPA?
- 5. Obtener SQL String de la consulta de Hibernate
- 6. Consulta de JPA para obtener todo el árbol
- 7. ¿Cómo escribir esta consulta usando la consulta de Criterios JPA?
- 8. Convertir cadena de consulta del/al objeto
- 9. ¿Cómo puedo obtener un objeto HDC de un objeto CDC?
- 10. Deserializar cadena de consulta al objeto JSON
- 11. Obtener cadena de consulta de recopilación
- 12. JPA 2.0 nativos resultados de la consulta como un mapa
- 13. NHibernate: Obtener objeto de consultas SQL
- 14. Lenguaje de consulta JPA criteriaBuilder
- 15. consulta SQL para obtener registros
- 16. ¿Puedo obtener un PTypeInfo de una cadena?
- 17. SQL Server: Obtener la clave principal tabla mediante consulta SQL
- 18. ¿Cómo obtener # valor de la cadena de consulta?
- 19. Obtener objeto de clase pitón de cadena
- 20. JPA - Criterios de consulta - Búsqueda de enteros usando "como"
- 21. Orden retorno de objetos secundarios en consulta JPA
- 22. jQuery cadena de consulta
- 23. ¿Cómo obtener CURDATE()/NOW() en una consulta con nombre JPA?
- 24. Consulta SQL para obtener la ruta de jerarquía completa
- 25. Cómo optimizar una consulta JPA
- 26. Consulta SQL para obtener el último precio
- 27. ¿puedo obtener count() y filas de una consulta sql en el servidor sql?
- 28. ¿La forma más rápida de obtener el primer objeto de un conjunto de consulta en django?
- 29. SQL en consulta (@Variable)
- 30. ¿Cómo puedo obtener el nombre de un Objeto en Java?
¿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.) –
Para la implementación de hibernación: query.unwrap (org.hibernate.Query.class) .getQueryString(). –