Как напечатать строку запроса со значениями параметров при использовании гибернации
Возможно ли в Hibernate печатать сгенерированные SQL-запросы с реальными значениями вместо вопросительных знаков?
Как бы вы предложили печатать запросы с реальными значениями, если это невозможно с помощью Hibernate API?
Переведено автоматически
Ответ 1
Вам необходимо включить ведение журнала для следующих категорий:
org.hibernate.SQL
debug
org.hibernate.type
trace
Таким образом, конфигурация log4j может выглядеть следующим образом:
# logs the SQL statementslog4j.logger.org.hibernate.SQL=debug # Logs the JDBC parameters passed to a querylog4j.logger.org.hibernate.type=trace
Первое эквивалентно hibernate.show_sql=true устаревшему свойству, второе помимо прочего, печатает связанные параметры.
hibernate.show_sql=true
Другим решением (не основанным на гибернации) было бы использовать драйвер прокси JDBC, такой как P6Spy.
Ответ 2
Если вы используете Spring Boot, просто настройте это:
application.yml
logging: level: org.hibernate.SQL: DEBUG org.hibernate.type: TRACE
application.properties
logging.level.org.hibernate.SQL=DEBUGlogging.level.org.hibernate.type=TRACE
и ничего более.
Ваш журнал будет выглядеть примерно так:
2020-12-07 | DEBUG | o.h.SQL:127 - insert into Employee (id, name, title, id) values (?, ?, ?, ?)2020-12-07 | TRACE | o.h.t.d.s.BasicBinder:64 - binding parameter [1] as [VARCHAR] - [001]2020-12-07 | TRACE | o.h.t.d.s.BasicBinder:64 - binding parameter [2] as [VARCHAR] - [John Smith]2020-12-07 | TRACE | o.h.t.d.s.BasicBinder:52 - binding parameter [3] as [VARCHAR] - [null]2020-12-07 | TRACE | o.h.t.d.s.BasicBinder:64 - binding parameter [4] as [BIGINT] - [1]
Ответ 3
Просто для удобства, вот такой же пример конфигурации для Logback (SLF4J)
<appender name="SQLROLLINGFILE"> <File>/tmp/sql.log</File> <rollingPolicy> <FileNamePattern>logFile.%d{yyyy-MM-dd}.log</FileNamePattern> </rollingPolicy> <layout> <Pattern>%-4date | %msg %n</Pattern> </layout></appender><logger name="org.hibernate.SQL" additivity="false" > <level value="DEBUG" /> <appender-ref ref="SQLROLLINGFILE" /></logger><logger name="org.hibernate.type" additivity="false" > <level value="TRACE" /> <appender-ref ref="SQLROLLINGFILE" /></logger>
Вывод в вашем sql.log (пример) тогда выглядит следующим образом:
2013-08-30 18:01:15,083 | update stepprovider set created_at=?, lastupdated_at=?, version=?, bundlelocation=?, category_id=?, customer_id=?, description=?, icon_file_id=?, name=?, shareStatus=?, spversion=?, status=?, title=?, type=?, num_used=? where id=?2013-08-30 18:01:15,084 | binding parameter [1] as [TIMESTAMP] - 2012-07-11 09:57:32.02013-08-30 18:01:15,085 | binding parameter [2] as [TIMESTAMP] - Fri Aug 30 18:01:15 CEST 20132013-08-30 18:01:15,086 | binding parameter [3] as [INTEGER] -2013-08-30 18:01:15,086 | binding parameter [4] as [VARCHAR] - com.mypackage.foo2013-08-30 18:01:15,087 | binding parameter [5] as [VARCHAR] -2013-08-30 18:01:15,087 | binding parameter [6] as [VARCHAR] -2013-08-30 18:01:15,087 | binding parameter [7] as [VARCHAR] - TODO2013-08-30 18:01:15,087 | binding parameter [8] as [VARCHAR] -2013-08-30 18:01:15,088 | binding parameter [9] as [VARCHAR] - MatchingStep@com.mypackage.foo2013-08-30 18:01:15,088 | binding parameter [10] as [VARCHAR] - PRIVATE2013-08-30 18:01:15,088 | binding parameter [11] as [VARCHAR] - 1.02013-08-30 18:01:15,088 | binding parameter [12] as [VARCHAR] - 322013-08-30 18:01:15,088 | binding parameter [13] as [VARCHAR] - MatchingStep2013-08-30 18:01:15,089 | binding parameter [14] as [VARCHAR] -2013-08-30 18:01:15,089 | binding parameter [15] as [INTEGER] - 02013-08-30 18:01:15,089 | binding parameter [16] as [VARCHAR] - 053c2e65-5d51-4c09-85f3-2281a1024f64
Ответ 4
Если вы используете Spring Boot 3 и / или гибернацию 6, значения параметров будут отображаться в следующей конфигурации:
# basic log level for all messageslogging.level.org.hibernate=info# SQL statements and parameterslogging.level.org.hibernate.SQL=debuglogging.level.org.hibernate.orm.jdbc.bind=trace# Statistics and slow querieslogging.level.org.hibernate.stat=debuglogging.level.org.hibernate.SQL_SLOW=info# 2nd Level Cachelogging.level.org.hibernate.cache=debug