É possível gerar o SQL gerado usando o Eclipselink sem ter que aumentar a verbosidade do log?
-
24-09-2019 - |
Pergunta
Quero produzir o SQL gerado pelo Eclipselink para o console, durante o desenvolvimento. No entanto, eu só poderia fazê -lo usando o nível de log. Eu tenho um modelo de domínio complexo composto por muitas classes, tanto que a implantação leva um tempo considerável quando a verbosidade do log está no nível fino, uma vez que o Eclipselink produz sua análise de todo o modelo.
Existe uma maneira de obter o SQL sem recorrer ao nível de log bem (como o Hibernate faz)?
Solução
Coloque as seguintes propriedades em seu persistence.xml
:
<property name="eclipselink.logging.level.sql" value="FINE"/>
<property name="eclipselink.logging.parameters" value="true"/>
Este último é útil, para que os valores do parâmetro sejam mostrados.
Uma alternativa está usando log4jdbc ou log4jdbc-remix.
Outras dicas
A geração de log para eclipselink parece bastante difícil de definir, de acordo com este tópico.
Menciona um persistence.xml
Arquivo com nível de log Você pode 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" />
Mas algumas outras configurações podem ser necessárias.
Como Martin documentos abaixo de, "Eclipselink/Exemplos/JPA/Logging"Documenta essas propriedades.
Para obter o SQL para uma consulta específica no tempo de execução, você pode usar a API do 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 conterá? para parâmetros. Para traduzir o SQL com os argumentos, você precisa de um banco de dados com os valores dos parâmetros.
DatabaseRecord recordWithValues= new DatabaseRecord();
recordWithValues.add(new DatabaseField("param1"), "someValue");
String sqlStringWithArgs =
databaseQuery.getTranslatedSQLString(session, recordWithValues);