To jest przydatne. Ale to nie pokazuje mi prawdziwych zapytań SQL.
Nicolas Barbulesco
6
@Nicolas to prawda, jednak natychmiast po zapytaniu odsyła powiązane parametry.
Xtreme Biker,
2
Używam grails 2.4.4 i hibernacji 4. Zmiana konfiguracji log4j nie działała dla mnie, ale działał p6spy!
Champ
10
W Hibernacji 5 możemy użyć org.hibernate.type.descriptor.sql.BasicBinderloggera. Umożliwianie logowania org.hibernate.typewydrukowało dla mnie zbyt wiele niepotrzebnych informacji ...
csharpfolk,
5
org.hibernate.typei org.hibernate.loader.hqlnie działa dla mnie wyświetlanie parametrów
Dherik,
75
Dla wygody, oto ten sam przykład konfiguracji dla Logback (SLF4J)
Log4JDBC to fajne rozwiązanie, które drukuje dokładny SQL idący do bazy danych z wprowadzonymi parametrami, a nie najpopularniejszą odpowiedź tutaj, która tego nie robi. Jedną z głównych zalet tego jest to, że można skopiować kod SQL bezpośrednio do interfejsu użytkownika bazy danych i wykonywać go tak, jak jest.
Mój plik konfiguracyjny logback.xml wygląda następująco: wyświetla wszystkie instrukcje SQL z parametrami oraz tabele zestawów wyników dla wszystkich zapytań.
<?xml version="1.0" encoding="UTF-8"?><configuration><appendername="STDOUT"class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
</pattern></encoder></appender><loggername="jdbc.audit"level="ERROR"/><loggername="jdbc.connection"level="ERROR"/><loggername="jdbc.sqltiming"level="ERROR"/><loggername="jdbc.resultset"level="ERROR"/><!-- UNCOMMENT THE BELOW TO HIDE THE RESULT SET TABLE OUTPUT --><!--<logger name="jdbc.resultsettable" level="ERROR" /> --><rootlevel="debug"><appender-refref="STDOUT"/></root></configuration>
Wreszcie musiałem utworzyć plik o nazwie log4jdbc.log4j2.properties w katalogu głównym ścieżki klasy, np. Src / test / resources lub src / main / resources w projekcie Mevn. Ten plik ma jeden wiersz, który jest poniżej:
10:44:29.400[main] DEBUG jdbc.sqlonly - org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:70)5.select memberrole0_.member_id as member_i2_12_0_, memberrole0_.id as id1_12_0_, memberrole0_.id
as id1_12_1_, memberrole0_.member_id as member_i2_12_1_, memberrole0_.role_id as role_id3_12_1_,
role1_.id as id1_17_2_, role1_.name as name2_17_2_ from member_roles memberrole0_ left outer
join roles role1_ on memberrole0_.role_id=role1_.id where memberrole0_.member_id=10410:44:29.402[main] INFO jdbc.resultsettable -|----------|---|---|----------|--------|---|-----||member_id |id |id |member_id |role_id |id |name ||----------|---|---|----------|--------|---|-----||----------|---|---|----------|--------|---|-----|
Hej .... To wydaje się fajne .... właśnie to, co lekarz dla mnie zamówił :) ... ale czy obsługuje też CLOB / BLOB? Czy można wyświetlić tylko zapytanie, a nie zestaw wyników. - Dzięki :)
dev ray
1
czy możesz podać przykład konfiguracji, jak to zrobić?
grep,
W rzeczywistości ta ostatnia generuje tabluarową reprezentację wyników zapytań ... tzn. Do poprawienia tej funkcji potrzebny jest remiks log4jdbc.
meriton
To rozwiązanie było najlepsze w mojej sytuacji, gdy potrzebowałem zobaczyć wartości numerów wierszy generowane przez Hibernację dla zestawów wyników stronicowania. Rejestrowanie śledzenia pokazuje tylko wartości parametrów zapytania.
Oliver Hernandez,
@Alan Hay, czy ten dziennik nawiasuje również zapytania?
org.hibernate.type.descriptor.sql.BasicBinderKategoria nie obejmuje wszystkich parametrów, np enum typów. Więc jeśli chcesz wszystkiego, naprawdę potrzebujesz TRACEcałej org.hibernate.typegrupy.
seanf
Dla mnie działa w Hibernacji 4.3! Ponadto nie ŚLEDZIŁEM pełnego typu org.hibernate.typ, ponieważ to zdecydowanie za dużo danych wyjściowych. W większości przypadków to rozwiązanie wystarczy.
cslotty
Zauważ, że org.hibernate.type.descriptor.sql.BasicExtractor rejestruje zestawy wyników. Tak więc wpis o dużym rozmiarze może nawet spowodować awarię aplikacji podczas logowania do konsoli w Eclipse, i przypuszczam, że nie jest również idealny do logowania do pliku. Dlatego wolę to rozwiązanie, działa również w Hibernacji 3. Dla tych, którzy są zainteresowani typami wyliczeń, wypróbuj dokładnie tę klasę, która je rejestruje, gdy org.hibernate.type = TRACE. Następnie ustaw org.hibernate.type.xyz.TheClassThatLogsEnumParams = TRACE.
Rozwiązanie jest poprawne, ale rejestruje również wszystkie powiązania dla obiektów wynikowych. Aby temu zapobiec, możliwe jest utworzenie osobnego programu dołączającego i włączenie filtrowania, na przykład:
<!-- A time/date based rolling appender --><appendername="FILE_HIBERNATE"class="org.jboss.logging.appender.DailyRollingFileAppender"><errorHandlerclass="org.jboss.logging.util.OnlyOnceErrorHandler"/><paramname="File"value="${jboss.server.log.dir}/hiber.log"/><paramname="Append"value="false"/><paramname="Threshold"value="TRACE"/><!-- Rollover at midnight each day --><paramname="DatePattern"value="'.'yyyy-MM-dd"/><layoutclass="org.apache.log4j.PatternLayout"><!-- The default pattern: Date Priority [Category] Message\n --><paramname="ConversionPattern"value="%d %-5p [%c] %m%n"/></layout><filterclass="org.apache.log4j.varia.StringMatchFilter"><paramname="StringToMatch"value="bind"/><paramname="AcceptOnMatch"value="true"/></filter><filterclass="org.apache.log4j.varia.StringMatchFilter"><paramname="StringToMatch"value="select"/><paramname="AcceptOnMatch"value="true"/></filter><filterclass="org.apache.log4j.varia.DenyAllFilter"/></appender><categoryname="org.hibernate.type"><priorityvalue="TRACE"/></category><loggername="org.hibernate.type"><levelvalue="TRACE"/><appender-refref="FILE_HIBERNATE"/></logger><loggername="org.hibernate.SQL"><levelvalue="TRACE"/><appender-refref="FILE_HIBERNATE"/></logger>
**If you want hibernate to print generated sql queries with real values instead of question marks.****add following entry in hibernate.cfg.xml/hibernate.properties:**
show_sql=true
format_sql=true
use_sql_comments=true**Andadd following entry in log4j.properties :**
log4j.logger.org.hibernate=INFO, hb
log4j.logger.org.hibernate.SQL=DEBUG
log4j.logger.org.hibernate.type=TRACE
log4j.appender.hb=org.apache.log4j.ConsoleAppender
log4j.appender.hb.layout=org.apache.log4j.PatternLayout
Hej single31 powyżej linii należy dodać do pliku konfiguracji hibernacji, to na pewno będzie działać. Zawsze publikuję rzeczy, które zrobiłem praktycznie.
Vijay Bhatt
3
Ta odpowiedź jest małą wariancją pytania. Czasami potrzebujemy sql tylko do celów debugowania w czasie wykonywania. W takim przypadku istnieje łatwiejszy sposób, używając debugowania w edytorach.
Umieść punkt przerwania na org.hibernate.loader.Loader.loadEntityBatch (lub nawiguj na stosie, aż tam będzie);
Kiedy wykonywanie jest zawieszone, spójrz na wartość zmiennej this.sql;
Dotyczy to hibernacji 3. Nie jestem pewien, czy to działa w innych wersjach.
teraz używa rejestrowania slf4j, jeśli domyślnym logowaniem jest log4j, musisz dodać zależności slf4j-api, slf4j-log4j12, aby korzystać z rejestrowania slf4j
krok 2: [wpisz swoje niestandardowe rejestrowanie]
package com.xxx;import java.sql.SQLException;import java.util.Properties;import com.mysql.jdbc.Connection;import com.mysql.jdbc.log.Log;publicclassCustomLoggingProfilerEventHandlerimplementsProfilerEventHandler{privateLog log;publicLoggingProfilerEventHandler(){}publicvoid consumeEvent(ProfilerEvent evt){/**
* you can only print the sql as this.log.logInfo(evt.getMessage())
* you can adjust your sql print log level with: DEBUG,INFO
* you can also handle the message to meet your requirement
*/this.log.logInfo(evt);}publicvoid destroy(){this.log =null;}publicvoid init(Connection conn,Properties props)throwsSQLException{this.log = conn.getLog();}}
Hej - to miłe. Ale myślę, że tutaj zapytania są drukowane za pomocą? następnie z wartościami parametrów. Ponieważ mam nieskończenie wiele zapytań, potrzebuję czegoś, co mogę po prostu skopiować i wkleić w edytorze sql, a zostaną one wykonane. Czy istnieje sposób, w jaki mogę to zrobić przy użyciu tego podejścia? Nie przepadam za bibliotekami stron trzecich. Dzięki :)
dev ray
Dzięki. Miałem nadzieję, że nie będę musiał używać żadnych rozwiązań innych firm i hibernować bezpośrednio, ale chyba nie mam innego wyboru.
dev ray
2
Rejestrowanie działa, ale nie dokładnie tak, jak chciałeś lub jakiś czas temu, ale P6Spy działa idealnie ,
Zmodyfikuj plik właściwości P6Spy
Zmodyfikuj plik właściwości P6Spy -spy.properties
Zamień na real driveristniejący sterownik JDBC MySQL
realdriver=com.mysql.jdbc.Driver#specifies another driver to use
realdriver2=#specifies a third driver to use
realdriver3=
Zmień lokalizację pliku dziennika Zmień lokalizację pliku dziennika we właściwości pliku dziennika, wszystkie instrukcje SQL zostaną zalogowane do tego pliku.
Windows
logfile = c:/spy.log
*nic
logfile =/srv/log/spy.log
Skopiuj “spy.properties”do ścieżki klas projektu
Skopiuj “spy.properties”do folderu głównego projektu, upewnij się, że Twój projekt może zlokalizować „spy.properties”, w przeciwnym razie pojawi się monit “spy.properties”o wyjątek nie znaleziony.
To była dla mnie najłatwiejsza droga do przodu w mojej aplikacji Spring Boot, w której próbowałem zalogować SQL wygenerowany z testu jednostkowego. Dodałem zależność testową do Gradle (testCompile 'p6spy: p6spy: 3.8.5'), dostosowałem application.yml, aby ustawić spring.datasource.url = jdbc: p6spy: h2: mem: testdb i spring.datasource.driver-class- name = com.p6spy.engine.spy.P6SpyDriver, a następnie dodał spy.properties z realdriver = org.h2.Driver i plikiem dziennika ustawionym na moją preferowaną ścieżkę. Łatwo było wyodrębnić pełny SQL z wynikowego pliku dziennika. Jedyną czkawką było to, że H2 nie lubił generowanego formatu znaczników czasu.
Dowiedziałem się za pośrednictwem tego wątku, że struktura logowania jboss używana przez hibernację musi zostać skonfigurowana w celu logowania przez slf4j. Dodałem następujący argument do argumentów VM aplikacji:
2013-10-3114:56:19,029 DEBUG [net.sf.hibernate.hql.QueryTranslator] HQL:select noti.id, noti.idmicrosite, noti.fcaducidad, noti.fpublicacion, noti.tipo, noti.imagen, noti.visible, trad.titulo, trad.subtitulo, trad.laurl, trad.urlnom, trad.fuente, trad.texto from org.ibit.rol.sac.micromodel.Noticia noti join noti.traducciones trad where index(trad)='ca'and noti.visible='S'and noti.idmicrosite=985and noti.tipo=34462013-10-3114:56:19,029 DEBUG [net.sf.hibernate.hql.QueryTranslator] SQL:select noticia0_.NOT_CODI as x0_0_, noticia0_.NOT_MICCOD as x1_0_, noticia0_.NOT_CADUCA as x2_0_, noticia0_.NOT_PUBLIC as x3_0_, noticia0_.NOT_TIPO as x4_0_, noticia0_.NOT_IMAGEN as x5_0_, noticia0_.NOT_VISIB as x6_0_, traduccion1_.NID_TITULO as x7_0_, traduccion1_.NID_SUBTIT as x8_0_, traduccion1_.NID_URL as x9_0_, traduccion1_.NID_URLNOM as x10_0_, traduccion1_.NID_FUENTE as x11_0_, traduccion1_.NID_TEXTO as x12_0_ from GUS_NOTICS noticia0_ inner join GUS_NOTIDI traduccion1_ on noticia0_.NOT_CODI=traduccion1_.NID_NOTCOD where(traduccion1_.NID_CODIDI='ca')and(noticia0_.NOT_VISIB='S')and(noticia0_.NOT_MICCOD=985)and(noticia0_.NOT_TIPO=3446)
Hej ... Nie mogę znaleźć żadnych przykładów tego podejścia. Czy możesz podać jakieś referencje / przykłady / samouczki. I czy nadal jest tak samo z najnowszymi wersjami lub hibernacją / log4j, czy stał się jakimś org.hibernate.QueryTranslator czy coś takiego. Dzięki
dev ray
Hej ... Próbowałem tego, ale wydaje się, że to nie działa z zapisem lub aktualizacją. Wydaje mi się, że to działa tylko w przypadku wybranych zapytań, w których do gry wchodzi tłumaczenie z hql na sql
dev ray
1
Wtyczka Log4Jdbc najlepiej spełnia Twoje wymagania. Pokazuje następujące-
1.Complete SQL query being hit to the db
2.Parameter values being passed to the query
3.Execution time taken by each query
Sprawdź poniższy link, aby skonfigurować Log4Jdbc-
Żadna z wyżej wymienionych odpowiedzi nie wydrukuje poprawnie sql z parametrami lub nie stanowi problemu. Osiągnąłem to za pomocą WireShark , który przechwytuje wszystkie zapytania sql / wysyłane z aplikacji do Oracle / Mysql itp. Za pomocą zapytań.
Wszystkie odpowiedzi tutaj są pomocne, ale jeśli używasz kontekstowego pliku XML aplikacji Spring do skonfigurowania fabryki sesji, ustawienie zmiennej poziomu log4j SQL pozwoli ci tylko częściowo temu zapobiec, musisz również ustawić zmienną hibernacji.show_sql w samym kontekście aplikacji, aby Hibernacja zaczęła faktycznie wyświetlać wartości.
ApplicationContext.xml ma:
<propertyname="hibernateProperties"><value>
hibernate.jdbc.batch_size=25
... <!-- Other parameter values here -->
hibernate.show_sql=true
</value></property>
Dzięki, drukuje zapytanie, ale nie parametry, których użył, czy jest też sposób na wydrukowanie parametrów?
Liz Lamperouge
0
Hibernacja pokazuje zapytanie i ich wartości parametrów w różnych wierszach.
Jeśli używasz application.properties w wiosennym rozruchu i możesz użyć poniżej podświetlonego parametru w application.properties.
org.hibernate.SQL pokaże zapytania
logowanie.level.org.hibernate.SQL = DEBUG
org.hibernate.type pokaże wszystkie wartości parametrów, które będą mapowane za pomocą zapytań select, insert i update. logowanie.level.org.hibernate.type = TRACE
org.hibernate.type.EnumType wyświetli wartość parametru typu wyliczeniowego
Nawet to nie pokazuje wartości limitu i przesunięcia w zapytaniach.
T3rm1
0
Najprostszym rozwiązaniem dla mnie jest zaimplementowanie zwykłego ciągu stringReplace w celu zastąpienia danych wejściowych parametrów wartościami parametrów (dla uproszczenia traktując wszystkie parametry jako ciąg znaków):
String debugedSql = sql;//then, for each named parameter
debugedSql = debugedSql.replaceAll(":"+key,"'"+value.toString()+"'");//and finnaly
println(debugedSql);
lub coś podobnego dla parametrów pozycyjnych (?).
Zadbaj o wartości zerowe i określone typy wartości, takie jak data, jeśli chcesz, aby SQL był gotowy do uruchomienia.
Odpowiedzi:
Musisz włączyć rejestrowanie dla następujących kategorii:
org.hibernate.SQL
- ustawione nadebug
rejestrowanie wszystkich instrukcji SQL DML podczas ich wykonywaniaorg.hibernate.type
- ustawiony natrace
rejestrowanie wszystkich parametrów JDBCKonfiguracja log4j może wyglądać następująco:
Pierwszy jest równoważny
hibernate.show_sql=true
wcześniejszej właściwości , drugi drukuje między innymi powiązane parametry.Innym rozwiązaniem (nie opartym na hibernacji) byłoby użycie sterownika proxy JDBC, takiego jak P6Spy .
źródło
org.hibernate.type.descriptor.sql.BasicBinder
loggera. Umożliwianie logowaniaorg.hibernate.type
wydrukowało dla mnie zbyt wiele niepotrzebnych informacji ...org.hibernate.type
iorg.hibernate.loader.hql
nie działa dla mnie wyświetlanie parametrówDla wygody, oto ten sam przykład konfiguracji dla Logback (SLF4J)
Dane wyjściowe w pliku sql.log (przykład) wyglądają następująco:
źródło
Zmień
hibernate.cfg.xml
na:Uwzględnij log4j i poniższe wpisy w „log4j.properties”:
źródło
binding parameter [1] as [VARCHAR] - [1]
.W przypadku użycia rozruchu wiosennego wystarczy skonfigurować to:
aplication.yml
aplication.properties
i nic więcej.
HTH
źródło
Log4JDBC to fajne rozwiązanie, które drukuje dokładny SQL idący do bazy danych z wprowadzonymi parametrami, a nie najpopularniejszą odpowiedź tutaj, która tego nie robi. Jedną z głównych zalet tego jest to, że można skopiować kod SQL bezpośrednio do interfejsu użytkownika bazy danych i wykonywać go tak, jak jest.
http://log4jdbc.sourceforge.net/
https://code.google.com/p/log4jdbc-remix/
Ta ostatnia wyświetla również tabelaryczną reprezentację wyników zapytania.
Przykładowe dane wyjściowe przedstawiające wygenerowany SQL z parametrami w miejscu wraz z tabelą zestawów wyników z zapytania:
Aktualizacja 2016
Ostatnio korzystam z log4jdbc-log4j2 ( https://code.google.com/archive/p/log4jdbc-log4j2/ ) z SLF4j i logback. Zależności Maven wymagane dla mojej konfiguracji są następujące:
Adresy URL sterownika i DB wyglądają następująco:
Mój plik konfiguracyjny logback.xml wygląda następująco: wyświetla wszystkie instrukcje SQL z parametrami oraz tabele zestawów wyników dla wszystkich zapytań.
Wreszcie musiałem utworzyć plik o nazwie log4jdbc.log4j2.properties w katalogu głównym ścieżki klasy, np. Src / test / resources lub src / main / resources w projekcie Mevn. Ten plik ma jeden wiersz, który jest poniżej:
Powyższe będzie zależeć od biblioteki logowania. Zobacz docs na https://code.google.com/archive/p/log4jdbc-log4j2 aby uzyskać więcej informacji
Przykładowe dane wyjściowe:
źródło
Możesz dodać linie kategorii do log4j.xml:
i dodaj właściwości hibernacji:
źródło
dodaj następujące właściwości i wartości do konfiguracji log4j lub logback:
źródło
org.hibernate.type.descriptor.sql.BasicBinder
Kategoria nie obejmuje wszystkich parametrów, np enum typów. Więc jeśli chcesz wszystkiego, naprawdę potrzebujeszTRACE
całejorg.hibernate.type
grupy.Możesz to zrobić za pomocą źródła danych proxy , jak opisałem w tym poście .
Zakładając, że Twoja aplikacja oczekuje
dataSource
komponentu bean (np. Via@Resource
), możesz skonfigurowaćdatasource-proxy
:Teraz wyjście Hibernacja vs źródło danych proxy:
Te
datasource-proxy
pytania zawierają wartości parametrów i można nawet dodać przechwytujących zwyczaj oświadczenie JDBC tak, że można złapać n + 1 kwestii zapytań bezpośrednio z twoich testów integracyjnych .źródło
włącz
org.hibernate.type
Logger, aby zobaczyć, jak rzeczywiste parametry są powiązane ze znakami zapytania.źródło
źródło
Rozwiązanie jest poprawne, ale rejestruje również wszystkie powiązania dla obiektów wynikowych. Aby temu zapobiec, możliwe jest utworzenie osobnego programu dołączającego i włączenie filtrowania, na przykład:
źródło
źródło
Ta odpowiedź jest małą wariancją pytania. Czasami potrzebujemy sql tylko do celów debugowania w czasie wykonywania. W takim przypadku istnieje łatwiejszy sposób, używając debugowania w edytorach.
Dotyczy to hibernacji 3. Nie jestem pewien, czy to działa w innych wersjach.
źródło
Sterownik mysql jdbc już zapewnia wygodę spełnienia tego wymagania, musisz przynajmniej mieć wersję jar> = mysql-connect-jar-5.1.6.jar
krok 1: [skonfiguruj plik jdbc.url, aby dodać rejestrator i rejestrowanie niestandardowe]
teraz używa rejestrowania slf4j, jeśli domyślnym logowaniem jest log4j, musisz dodać zależności slf4j-api, slf4j-log4j12, aby korzystać z rejestrowania slf4j
krok 2: [wpisz swoje niestandardowe rejestrowanie]
źródło
Podoba mi się to dla log4j:
źródło
Rejestrowanie działa, ale nie dokładnie tak, jak chciałeś lub jakiś czas temu, ale P6Spy działa idealnie ,
oto prosty samouczek do zaimplementowania również samouczek MKYONG dla P6Spy .
dla mnie działało to jak urok.
Pobierz plik „p6spy-install.jar”
Wyodrębnij
p6spy-install.jar
plik, wyszukajp6spy.jar
ispy.properties
Dodaj
p6spy.jar
do zależności biblioteki projektówZmodyfikuj plik konfiguracyjny bazy danych. Musisz zastąpić istniejący sterownik JDBC sterownikiem P6Spy JDBC -
com.p6spy.engine.spy.P6SpyDriver
Oryginał to sterownik JDBC MySQL -
com.mysql.jdbc.Driver
Zmieniono na sterownik JDBC P6Spy -
com.p6spy.engine.spy.P6SpyDriver
spy.properties
Zamień na
real driver
istniejący sterownik JDBC MySQLZmień lokalizację pliku dziennika Zmień lokalizację pliku dziennika we właściwości pliku dziennika, wszystkie instrukcje SQL zostaną zalogowane do tego pliku.
Windows
*nic
“spy.properties”
do ścieżki klas projektuSkopiuj
“spy.properties”
do folderu głównego projektu, upewnij się, że Twój projekt może zlokalizować „spy.properties”, w przeciwnym razie pojawi się monit“spy.properties”
o wyjątek nie znaleziony.źródło
źródło
Korzystając z Hibernacji 4 i slf4j / log4j2, próbowałem dodać następujące elementy w mojej konfiguracji log4j2.xml:
Ale bez powodzenia.
Dowiedziałem się za pośrednictwem tego wątku, że struktura logowania jboss używana przez hibernację musi zostać skonfigurowana w celu logowania przez slf4j. Dodałem następujący argument do argumentów VM aplikacji:
I działało jak urok.
źródło
Oto, co zadziałało dla mnie, ustaw poniżej właściwości w pliku log4j.file:
Ustawienia właściwości hibernacji:
źródło
do programowania w Wildfly (standalone.xml), dodaj te rejestratory:
źródło
jeśli używasz hibernacji 3.2.xx użyj
zamiast
źródło
Możesz zalogować to:
Przykład wyjściowy:
źródło
Wtyczka Log4Jdbc najlepiej spełnia Twoje wymagania. Pokazuje następujące-
Sprawdź poniższy link, aby skonfigurować Log4Jdbc-
źródło
Użyj Wireshark lub czegoś podobnego:
Żadna z wyżej wymienionych odpowiedzi nie wydrukuje poprawnie sql z parametrami lub nie stanowi problemu. Osiągnąłem to za pomocą WireShark , który przechwytuje wszystkie zapytania sql / wysyłane z aplikacji do Oracle / Mysql itp. Za pomocą zapytań.
źródło
Wszystkie odpowiedzi tutaj są pomocne, ale jeśli używasz kontekstowego pliku XML aplikacji Spring do skonfigurowania fabryki sesji, ustawienie zmiennej poziomu log4j SQL pozwoli ci tylko częściowo temu zapobiec, musisz również ustawić zmienną hibernacji.show_sql w samym kontekście aplikacji, aby Hibernacja zaczęła faktycznie wyświetlać wartości.
ApplicationContext.xml ma:
I twój plik log4j potrzebuje
źródło
W Javie:
Przekształć zapytanie w TypedQuery, jeśli jest to CriteriaQuery (javax.persistence).
Następnie:
query.unwrap (org.hibernate.Query.class) .getQueryString ();
źródło
Hibernacja pokazuje zapytanie i ich wartości parametrów w różnych wierszach.
Jeśli używasz application.properties w wiosennym rozruchu i możesz użyć poniżej podświetlonego parametru w application.properties.
org.hibernate.SQL pokaże zapytania
logowanie.level.org.hibernate.SQL = DEBUG
org.hibernate.type pokaże wszystkie wartości parametrów, które będą mapowane za pomocą zapytań select, insert i update. logowanie.level.org.hibernate.type = TRACE
org.hibernate.type.EnumType wyświetli wartość parametru typu wyliczeniowego
logowanie.level.org.hibernate.type.EnumType = TRACE
przykład ::
sql.BasicBinder wyświetli wartość parametru typu liczba całkowita, varchar, wartość logiczna
logging.level.org.hibernate.type.descriptor.sql.BasicBinder = TRACE
przykład ::
źródło
Najprostszym rozwiązaniem dla mnie jest zaimplementowanie zwykłego ciągu stringReplace w celu zastąpienia danych wejściowych parametrów wartościami parametrów (dla uproszczenia traktując wszystkie parametry jako ciąg znaków):
lub coś podobnego dla parametrów pozycyjnych (?).
Zadbaj o wartości zerowe i określone typy wartości, takie jak data, jeśli chcesz, aby SQL był gotowy do uruchomienia.
źródło