Kiedy mój kod wywołuje takie wywołanie:
entityManager.find(Customer.class, customerID);
Jak mogę zobaczyć zapytanie SQL dla tego wywołania? Zakładając, że nie mam dostępu do serwera bazy danych w celu profilowania / monitorowania połączeń, czy istnieje sposób na rejestrowanie lub przeglądanie w moim IDE odpowiednich zapytań SQL wysyłanych przez wywołania JPA? Idę na SQL Server 2008 R2 używając sterownika jTDS.
Odpowiedzi:
Opcje rejestrowania są zależne od dostawcy. Musisz wiedzieć, której implementacji JPA używasz.
Hibernacja ( patrz tutaj ):
EclipseLink ( patrz tutaj ):
OpenJPA ( patrz tutaj ):
DataNucleus ( patrz tutaj ):
Ustaw kategorię dziennika
DataNucleus.Datastore.Native
na poziom, na przykładDEBUG
.źródło
Ponadto, jeśli używasz EclipseLink i chcesz wyprowadzić wartości parametrów SQL, możesz dodać tę właściwość do swojego pliku persistence.xml:
źródło
Jeśli używasz hibernacji i logowania jako loggera, możesz użyć następujących elementów (pokazuje tylko powiązania, a nie wyniki):
org.hibernate.SQL = DEBUG drukuje zapytanie
org.hibernate.type = TRACE wypisuje powiązania i normalnie wyniki, które zostaną pominięte przez niestandardowy filtr
Potrzebujesz zależności janino (http://logback.qos.ch/manual/filters.html#JaninoEventEvaluator):
źródło
W EclipseLink, aby uzyskać SQL dla konkretnego zapytania w czasie wykonywania, możesz użyć interfejsu API DatabaseQuery:
Ten SQL będzie zawierał? dla parametrów. Aby uzyskać tłumaczenie SQL z argumentami, potrzebujesz DatabaseRecord z wartościami parametrów.
Źródło: jak uzyskać kod SQL do zapytania
źródło
Aby wyświetlić wszystkie SQL i parametry w OpenJPA, umieść te dwa parametry w pliku persistence.xml:
źródło
Jeśli chcesz zobaczyć dokładne zapytania wraz z wartościami parametrów i zwracanymi wartościami, możesz użyć sterownika proxy jdbc. Przechwytuje wszystkie wywołania jdbc i rejestruje ich wartości. Niektóre serwery proxy:
Mogą również zapewniać dodatkowe funkcje, takie jak mierzenie czasu wykonywania zapytań i zbieranie statystyk.
źródło
Przykład z użyciem log4j ( src \ log4j.xml ):
źródło
Zrobiłem ściągawkę, która moim zdaniem może być przydatna dla innych. We wszystkich przykładach możesz usunąć
format_sql
właściwość, jeśli chcesz zachować zarejestrowane zapytania w jednej linii (bez ładnego drukowania).Ładnie drukuj zapytania SQL, aby ustandaryzować bez parametrów przygotowanych instrukcji i bez optymalizacji struktury logowania :
application.properties
plik:application.yml
plik:Ładnie drukowane zapytania SQL z parametrami przygotowanych instrukcji przy użyciu struktury logowania :
application.properties
plik:application.yml
plik:Ładnie drukowane zapytania SQL bez parametrów przygotowanych instrukcji za pomocą struktury logowania :
application.properties
plik:application.yml
plik:Źródło (i więcej szczegółów): https://www.baeldung.com/sql-logging-spring-boot
źródło
Dodatkowo, jeśli używasz WildFly / JBoss, ustaw poziom rejestrowania org.hibernate na DEBUG
źródło
Inna dobra opcja, jeśli masz za dużo dziennika i chcesz umieścić tylko tymczasowy
System.out.println()
, możesz, w zależności od dostawcy, zrobić:źródło
Jeśli używasz Spring Framework. Zmodyfikuj plik application.properties jak poniżej
źródło
Zobacz temat Nie można zatrzymać hibernacji i wyświetlać kod SQL przy użyciu adaptera Spring JPA Vendor Adapter
źródło
W przypadku Spring Boot wystarczy dodać: spring.jpa.show-sql = true do application.properties. Spowoduje to wyświetlenie zapytania, ale bez rzeczywistych parametrów (zobaczysz? Zamiast każdego parametru).
źródło
Podczas opracowywania eksploracyjnego i aby skupić się na rejestrowaniu debugowania SQL na określonej metodzie, którą chcę sprawdzić, dekoruję tę metodę następującymi instrukcjami rejestratora:
źródło
EclipseLink do wyprowadzenia kodu SQL (persistence.xml config):
źródło
Jest plik o nazwie persistence.xml Naciśnij Ctrl + Shift + R i znajdź go, a następnie jest miejsce napisane coś w rodzaju showSQL.
Po prostu powiedz to jako prawdę
Nie jestem pewien, czy serwer musi być uruchomiony w trybie debugowania. Sprawdź SQL utworzone na konsoli.
źródło