¿Es posible generar SQL generado usando EclipseLink sin tener que aumentar el nivel de detalle del registro?


Quiero generar el SQL generado por EclipseLink a la consola, durante el desarrollo. Sin embargo, solo pude hacerlo usando el nivel de registro FINE. Tengo un modelo de dominio complejo compuesto de muchas clases, tanto que el despliegue toma una cantidad considerable de tiempo cuando el nivel de detalle del registro está en el nivel FINO, ya que EclipseLink produce su análisis de todo el modelo.

¿Hay alguna manera de obtener el SQL sin recurrir al nivel de registro FINO (como lo hace Hibernate)?

Author: Martijn Pieters, 2010-03-03

3 answers

Ponga las siguientes propiedades en su persistence.xml:

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

Esto último es útil, para que se muestren los valores del parámetro.

Una alternativa es usar log4jdbc o log4jdbc-remix.

 53
Author: jbandi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-05 12:57:22

La generación de registros para EclipseLink parece bastante difícil de establecer, segúneste hilo.

Menciona un archivo persistence.xml con nivel de registro que puede adaptar:

<property name="eclipselink.weaving" value="static" />
<property name="eclipselink.logging.level.sql" value="FINEST" />
<property name="eclipselink.logging.level" value="FINEST" />
<property name="eclipselink.logging.level.cache" value="FINEST" />

Pero es posible que se necesiten otros ajustes.

Como Martin documenta a continuación, "EclipseLink / Examples/JPA / Logging" documenta esas propiedades.

 20
Author: VonC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:54:06

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 parámetros. Para traducir el SQL con los argumentos se 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);

Fuente: Cómo obtener el SQL para una consulta

 9
Author: Tomasz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-03 18:37:25