Quando meu código emite uma chamada como esta:
entityManager.find(Customer.class, customerID);
Como posso ver a consulta SQL para esta chamada? Supondo que não tenho acesso ao servidor de banco de dados para criar um perfil / monitorar as chamadas, existe uma maneira de registrar ou exibir no meu IDE as consultas SQL correspondentes emitidas pelas chamadas JPA? Estou indo contra o SQL Server 2008 R2 usando o driver jTDS.
Respostas:
As opções de log são específicas do provedor. Você precisa saber qual implementação de JPA você usa.
Hibernação ( veja aqui ):
EclipseLink ( veja aqui ):
OpenJPA ( veja aqui ):
DataNucleus ( veja aqui ):
Defina a categoria de log
DataNucleus.Datastore.Native
para um nível, comoDEBUG
.fonte
Além disso, se você estiver usando o EclipseLink e quiser gerar os valores dos parâmetros SQL, poderá adicionar esta propriedade ao seu arquivo persistence.xml:
fonte
Se você usar o hibernate e o logback como seu criador de logs, poderá usar o seguinte (mostra apenas as ligações e não os resultados):
org.hibernate.SQL = DEBUG imprime a consulta
org.hibernate.type = TRACE imprime as ligações e normalmente os resultados, que serão suprimidos pelo filtro personalizado
Você precisa da dependência do janino (http://logback.qos.ch/manual/filters.html#JaninoEventEvaluator):
fonte
No EclipseLink para obter o SQL para uma consulta específica em tempo de execução, você pode usar a API DatabaseQuery:
Este SQL irá conter? para parâmetros. Para obter o SQL traduzido com os argumentos, você precisa de um DatabaseRecord com os valores dos parâmetros.
Fonte: Como obter o SQL para uma consulta
fonte
Para visualizar todo o SQL e parâmetros no OpenJPA, coloque esses dois parâmetros no persistence.xml:
fonte
Se você quiser ver as consultas exatas com os valores dos parâmetros e valores de retorno, poderá usar um driver proxy jdbc. Ele interceptará todas as chamadas jdbc e registrará seus valores. Alguns proxies:
Eles também podem fornecer alguns recursos adicionais, como medir o tempo de execução para consultas e coletar estatísticas.
fonte
Exemplo usando log4j ( src \ log4j.xml ):
fonte
Fiz uma folha de dicas que acho que pode ser útil para outras pessoas. Em todos os exemplos, você pode remover a
format_sql
propriedade se desejar manter as consultas registradas em uma única linha (nenhuma impressão bonita).Impressões SQL de impressão bonita para padronizar sem parâmetros de instruções preparadas e sem otimizações de uma estrutura de log :
application.properties
Arquivo:application.yml
Arquivo:Imprima consultas SQL com parâmetros de instruções preparadas usando uma estrutura de log :
application.properties
Arquivo:application.yml
Arquivo:Imprima consultas SQL sem parâmetros de instruções preparadas usando uma estrutura de log :
application.properties
Arquivo:application.yml
Arquivo:Fonte (e mais detalhes): https://www.baeldung.com/sql-logging-spring-boot
fonte
Além disso, se você estiver usando o WildFly / JBoss, defina o nível de log do org.hibernate como DEBUG
fonte
Outra boa opção se você tiver muito log e quiser colocar apenas como temporal
System.out.println()
, pode, dependendo do seu provedor:fonte
Se você estiver usando o framework Spring. Modifique seu arquivo application.properties como abaixo
fonte
Consulte Não é possível fazer a hibernação parar de mostrar SQL usando o Spring JPA Vendor Adapter
fonte
Com o Spring Boot, basta adicionar: spring.jpa.show-sql = true a application.properties. Isso mostrará a consulta, mas sem os parâmetros reais (você verá? Em vez de cada parâmetro).
fonte
Durante o desenvolvimento exploratório, e para focar o log de depuração SQL no método específico que desejo verificar, decorei esse método com as seguintes instruções do logger:
fonte
EclipseLink para gerar o SQL (persistence.xml config):
fonte
Há um arquivo chamado persistence.xml Pressione Ctrl + Shift + R e localize-o; então, há um lugar escrito como showSQL.
Basta colocar como verdade
Não tenho certeza se o servidor deve ser iniciado como modo de depuração. Verifique os SQLs criados no console.
fonte