Возможно ли в Hibernate печатать созданные SQL-запросы с реальными значениями вместо вопросительных знаков?
Как вы предлагаете печатать запросы с реальными значениями, если это невозможно с помощью Hibernate API?
Возможно ли в Hibernate печатать созданные SQL-запросы с реальными значениями вместо вопросительных знаков?
Как вы предлагаете печатать запросы с реальными значениями, если это невозможно с помощью Hibernate API?
Вам нужно включить logging для следующих категорий:
org.hibernate.SQL
- установить в debug
для регистрации всех операторов SQL DML по мере их выполнения.org.hibernate.type
- установить на trace
для регистрации всех параметров JDBCТаким образом, конфигурация log4j может выглядеть так:
# logs the SQL statements
log4j.logger.org.hibernate.SQL=debug
# Logs the JDBC parameters passed to a query
log4j.logger.org.hibernate.type=trace
Первый эквивалент hibernate.show_sql=true
legacy свойство, второй печатает связанные параметры между прочим.
Другим решением (без спящего режима) было бы использовать прокси-драйвер JDBC, например P6Spy.
Просто для удобства, вот тот же пример конфигурации для журнала (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.0
2013-08-30 18:01:15,085 | binding parameter [2] as [TIMESTAMP] - Fri Aug 30 18:01:15 CEST 2013
2013-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.foo
2013-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] - TODO
2013-08-30 18:01:15,087 | binding parameter [8] as [VARCHAR] -
2013-08-30 18:01:15,088 | binding parameter [9] as [VARCHAR] - [email protected]
2013-08-30 18:01:15,088 | binding parameter [10] as [VARCHAR] - PRIVATE
2013-08-30 18:01:15,088 | binding parameter [11] as [VARCHAR] - 1.0
2013-08-30 18:01:15,088 | binding parameter [12] as [VARCHAR] - 32
2013-08-30 18:01:15,088 | binding parameter [13] as [VARCHAR] - MatchingStep
2013-08-30 18:01:15,089 | binding parameter [14] as [VARCHAR] -
2013-08-30 18:01:15,089 | binding parameter [15] as [INTEGER] - 0
2013-08-30 18:01:15,089 | binding parameter [16] as [VARCHAR] - 053c2e65-5d51-4c09-85f3-2281a1024f64
Измените hibernate.cfg.xml
на:
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="use_sql_comments">true</property>
Включить log4j и ниже записей в "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
Log4JDBC - хорошее решение, которое печатает точный SQL, идущий в базу данных с параметрами, а не самый популярный ответ, который не делает этого. Одним из основных преимуществ этого является то, что вы можете копировать SQL прямо в интерфейс DB и выполнять как есть.
http://log4jdbc.sourceforge.net/
https://code.google.com/p/log4jdbc-remix/
Последний также выводит табличное представление результатов запроса.
Пример вывода, показывающий сгенерированный SQL с параметрами на месте вместе с таблицей набора результатов из запроса:
5. insert into ENQUIRY_APPLICANT_DETAILS (ID, INCLUDED_IN_QUOTE, APPLICANT_ID, TERRITORY_ID, ENQUIRY_ID, ELIGIBLE_FOR_COVER) values (7, 1, 11, 1, 2, 0)
10 Oct 2013 16:21:22 4953 [main] INFO jdbc.resultsettable - |---|--------|--------|-----------|----------|---------|-------|
10 Oct 2013 16:21:22 4953 [main] INFO jdbc.resultsettable - |ID |CREATED |DELETED |CODESET_ID |NAME |POSITION |PREFIX |
10 Oct 2013 16:21:22 4953 [main] INFO jdbc.resultsettable - |---|--------|--------|-----------|----------|---------|-------|
10 Oct 2013 16:21:22 4953 [main] INFO jdbc.resultsettable - |2 |null |null |1 |Country 2 |1 |60 |
10 Oct 2013 16:21:22 4953 [main] INFO jdbc.resultsettable - |---|--------|--------|-----------|----------|---------|-------|
Совсем недавно я использовал log4jdbc-log4j2 (https://code.google.com/archive/p/log4jdbc-log4j2/) с SLF4j и logback. Зависимости Maven, необходимые для моей установки, перечислены ниже:
<dependency>
<groupId>org.bgee.log4jdbc-log4j2</groupId>
<artifactId>log4jdbc-log4j2-jdbc4.1</artifactId>
<version>1.16</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>${logback.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>$logback.version}</version>
</dependency>
Драйвер и URL-адрес БД выглядят следующим образом:
database.driver.class=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
database.url=jdbc:log4jdbc:hsqldb:mem:db_name #Hsql
#database.url=jdbc:log4jdbc:mysql://localhost:3306/db_name
Мой файл конфигурации logback.xml выглядит следующим образом: здесь выводятся все операторы SQL с параметрами плюс таблицы наборов результатов для всех запросов.
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
</pattern>
</encoder>
</appender>
<logger name="jdbc.audit" level="ERROR" />
<logger name="jdbc.connection" level="ERROR" />
<logger name="jdbc.sqltiming" level="ERROR" />
<logger name="jdbc.resultset" level="ERROR" />
<!-- UNCOMMENT THE BELOW TO HIDE THE RESULT SET TABLE OUTPUT -->
<!--<logger name="jdbc.resultsettable" level="ERROR" /> -->
<root level="debug">
<appender-ref ref="STDOUT" />
</root>
</configuration>
Наконец, мне пришлось создать файл с именем log4jdbc.log4j2.properties в корне пути к классам, например, src/test/resources или src/main/resources в проекте Mevn. Этот файл имеет одну строку, которая ниже:
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
Выше будет зависеть от вашей библиотеки журналов. См. Документы по адресу https://code.google.com/archive/p/log4jdbc-log4j2 для получения дополнительной информации.
Пример вывода:
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=104
10:44:29.402 [main] INFO jdbc.resultsettable -
|----------|---|---|----------|--------|---|-----|
|member_id |id |id |member_id |role_id |id |name |
|----------|---|---|----------|--------|---|-----|
|----------|---|---|----------|--------|---|-----|
В случае использования spring используется загрузка, просто настройте это:
aplication.yml
logging:
level:
org.hibernate.SQL: DEBUG
org.hibernate.type: TRACE
aplication.properties
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type=TRACE
и ничего более.
НТН
Вы можете добавить строки категорий в log4j.xml:
<category name="org.hibernate.type">
<priority value="TRACE"/>
</category>
и добавьте свойства спящего режима:
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="use_sql_comments">true</property>
добавьте следующие свойства и значения в конфигурацию log4j или logback:
org.hibernate.sql=DEBUG
org.hibernate.type.descriptor.sql.BasicBinder=TRACE
Вы можете сделать это с помощью datasource-proxy, как я описал в этом посте.
Предполагая, что ваше приложение ожидает dataSource
компонент dataSource
(например, через @Resource
), вы можете настроить datasource-proxy
:
<bean id="actualDataSource" class="bitronix.tm.resource.jdbc.PoolingDataSource" init-method="init"
destroy-method="close">
<property name="className" value="bitronix.tm.resource.jdbc.lrc.LrcXADataSource"/>
<property name="uniqueName" value="actualDataSource"/>
<property name="minPoolSize" value="0"/>
<property name="maxPoolSize" value="5"/>
<property name="allowLocalTransactions" value="false" />
<property name="driverProperties">
<props>
<prop key="user">${jdbc.username}</prop>
<prop key="password">${jdbc.password}</prop>
<prop key="url">${jdbc.url}</prop>
<prop key="driverClassName">${jdbc.driverClassName}</prop>
</props>
</property>
</bean>
<bean id="proxyDataSource" class="net.ttddyy.dsproxy.support.ProxyDataSource">
<property name="dataSource" ref="testDataSource"/>
<property name="listener">
<bean class="net.ttddyy.dsproxy.listener.ChainListener">
<property name="listeners">
<list>
<bean class="net.ttddyy.dsproxy.listener.CommonsQueryLoggingListener">
<property name="logLevel" value="INFO"/>
</bean>
<bean class="net.ttddyy.dsproxy.listener.DataSourceQueryCountListener"/>
</list>
</property>
</bean>
</property>
</bean>
<alias name="proxyDataSource" alias="dataSource"/>
Теперь вывод Hibernate vs datasource-proxy:
INFO [main]: n.t.d.l.CommonsQueryLoggingListener - Name:, Time:1, Num:1, Query:{[select company0_.id as id1_6_, company0_.name as name2_6_ from Company company0_][]}
INFO [main]: n.t.d.l.CommonsQueryLoggingListener - Name:, Time:0, Num:1, Query:{[insert into WarehouseProductInfo (id, quantity) values (default, ?)][19]}
INFO [main]: n.t.d.l.CommonsQueryLoggingListener - Name:, Time:0, Num:1, Query:{[insert into Product (id, code, company_id, importer_id, name, version) values (default, ?, ?, ?, ?, ?)][phoneCode,1,-5,Phone,0]}
Запросы datasource-proxy
данных содержат значения параметров, и вы даже можете добавить пользовательские перехватчики операторов JDBC, чтобы вы могли выявить проблемы N + 1 запросов прямо из ваших интеграционных тестов.
включите регистратор org.hibernate.type
, чтобы узнать, как привязаны фактические параметры к вопросительным знакам.
<!-- A time/date based rolling appender -->
<appender name="FILE" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="logs/system.log" />
<param name="Append" value="true" />
<param name="ImmediateFlush" value="true" />
<param name="MaxFileSize" value="200MB" />
<param name="MaxBackupIndex" value="100" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %d{Z} [%t] %-5p (%F:%L) - %m%n" />
</layout>
</appender>
<appender name="journaldev-hibernate" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="logs/project.log" />
<param name="Append" value="true" />
<param name="ImmediateFlush" value="true" />
<param name="MaxFileSize" value="200MB" />
<param name="MaxBackupIndex" value="50" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %d{Z} [%t] %-5p (%F:%L) - %m%n" />
</layout>
</appender>
<logger name="com.journaldev.hibernate" additivity="false">
<level value="DEBUG" />
<appender-ref ref="journaldev-hibernate" />
</logger>
<logger name="org.hibernate" additivity="false">
<level value="INFO" />
<appender-ref ref="FILE" />
</logger>
<logger name="org.hibernate.type" additivity="false">
<level value="TRACE" />
<appender-ref ref="FILE" />
</logger>
<root>
<priority value="INFO"></priority>
<appender-ref ref="FILE" />
</root>
Решение корректно, но также регистрирует все привязки для объектов результатов. Чтобы предотвратить это, можно создать отдельный appender и включить фильтрацию, например:
<!-- A time/date based rolling appender -->
<appender name="FILE_HIBERNATE" class="org.jboss.logging.appender.DailyRollingFileAppender">
<errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/>
<param name="File" value="${jboss.server.log.dir}/hiber.log"/>
<param name="Append" value="false"/>
<param name="Threshold" value="TRACE"/>
<!-- Rollover at midnight each day -->
<param name="DatePattern" value="'.'yyyy-MM-dd"/>
<layout class="org.apache.log4j.PatternLayout">
<!-- The default pattern: Date Priority [Category] Message\n -->
<param name="ConversionPattern" value="%d %-5p [%c] %m%n"/>
</layout>
<filter class="org.apache.log4j.varia.StringMatchFilter">
<param name="StringToMatch" value="bind" />
<param name="AcceptOnMatch" value="true" />
</filter>
<filter class="org.apache.log4j.varia.StringMatchFilter">
<param name="StringToMatch" value="select" />
<param name="AcceptOnMatch" value="true" />
</filter>
<filter class="org.apache.log4j.varia.DenyAllFilter"/>
</appender>
<category name="org.hibernate.type">
<priority value="TRACE"/>
</category>
<logger name="org.hibernate.type">
<level value="TRACE"/>
<appender-ref ref="FILE_HIBERNATE"/>
</logger>
<logger name="org.hibernate.SQL">
<level value="TRACE"/>
<appender-ref ref="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
**And add 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
Этот ответ немного отличается от вопроса. Иногда нам требуется только sql только для целей отладки во время выполнения. В этом случае есть более простой способ, использующий отладку на редакторах.
Это для спящего режима 3. Я не уверен, что эта работа работает в других версиях.
Мне нравится это для log4j:
log4j.logger.org.hibernate.SQL=trace
log4j.logger.org.hibernate.engine.query=trace
log4j.logger.org.hibernate.type=trace
log4j.logger.org.hibernate.jdbc=trace
log4j.logger.org.hibernate.type.descriptor.sql.BasicExtractor=error
log4j.logger.org.hibernate.type.CollectionType=error
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n" />
</layout>
</appender>
<logger name="org.hibernate" additivity="false">
<level value="INFO" />
<appender-ref ref="console" />
</logger>
<logger name="org.hibernate.type" additivity="false">
<level value="TRACE" />
<appender-ref ref="console" />
</logger>
Используя Hibernate 4 и slf4j/log4j2, я попытался добавить следующее в мою конфигурацию log4j2.xml:
<Logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="trace" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
<Logger name="org.hibernate.type.EnumType" level="trace" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
Но без успеха.
Я узнал через этот поток, что фреймворк jboss-logging, используемый спящим режимом, необходимо настроить для входа в slf4j. Я добавил следующий аргумент в аргументы VM приложения:
-Dorg.jboss.logging.provider=slf4j
И это сработало как шарм.
Драйвер mysql jdbc уже обеспечивает удобство выполнения этого требования, вы должны, по крайней мере, иметь версию jar >= mysql-connect-jar-5.1.6.jar
шаг 1: [настроить jdbc.url для добавления регистратора и пользовательского ведения журнала]
jdbc.url=jdbc:mysql://host:port/your_db?logger=com.mysql.jdbc.log.Slf4JLogger&profileSQL=true&profilerEventHandler=com.xxx.CustomLoggingProfilerEventHandler
теперь используется ведение журнала slf4j, если ваш журнал по умолчанию - log4j, вы должны добавить зависимости slf4j-api, slf4j-log4j12 для использования регистрации slf4j
шаг 2: [написать свое собственное ведение журнала]
package com.xxx;
import java.sql.SQLException;
import java.util.Properties;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.log.Log;
public class CustomLoggingProfilerEventHandler implements ProfilerEventHandler {
private Log log;
public LoggingProfilerEventHandler() {
}
public void 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);
}
public void destroy() {
this.log = null;
}
public void init(Connection conn, Properties props) throws SQLException {
this.log = conn.getLog();
}
}
Вот что сработало для меня, установив ниже свойство в файле log4j.file:
log4j.logger.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
Настройки свойств гибернации:
hibernate.show_sql=true
если вы используете hibernate 3.2.xx используйте
log4j.logger.org.hibernate.SQL=trace
вместо
log4j.logger.org.hibernate.SQL=debug
Используйте Wireshark или что-то подобное:
Ни один из вышеупомянутых ответов не будет печатать sql с параметрами должным образом или является болью. Я достиг этого, используя Wireshark, который захватывает все SQL/команды, отправляемые из приложения в Oracle/Mysql и т.д. С запросами.
Вы можете зарегистрировать это:
net.sf.hibernate.hql.QueryTranslator
Пример вывода:
2013-10-31 14: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=985 and noti.tipo=3446
2013-10-31 14: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 )
Плагин Log4Jdbc лучше всего подходит для вашего требования. Он показывает следующее -
1. Complete SQL query being hit to the db
2. Parameter values being passed to the query
3. Execution time taken by each query
См. ссылку для настройки Log4Jdbc -
https://code.google.com/p/log4jdbc/
Ведение журнала работает, но не совсем вы хотите или я хотел какое-то время назад, но P6Spy действительно работает отлично,
вот простой учебник по реализации, а также учебник MKYONG для P6Spy.
для меня это работало как прелесть.
Получить "p6spy-install.jar"
Извлеките файл p6spy-install.jar
, найдите p6spy.jar
и spy.properties
Добавьте p6spy.jar
в зависимость от библиотеки проекта
Измените файл конфигурации базы данных. Вам необходимо заменить существующий драйвер JDBC на драйвер P6Spy JDBC - com.p6spy.engine.spy.P6SpyDriver
Оригинал - это драйвер JDBC для MySQL - com.mysql.jdbc.Driver
<session-factory>
<property name="hibernate.bytecode.use_reflection_optimizer">false</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.password">password</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mkyong</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">true</property>
</session-factory>
Изменен для драйвера P6Spy JDBC - com.p6spy.engine.spy.P6SpyDriver
<session-factory>
<property name="hibernate.bytecode.use_reflection_optimizer">false</property>
<property name="hibernate.connection.driver_class">com.p6spy.engine.spy.P6SpyDriver
</property>
<property name="hibernate.connection.password">password</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mkyong</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">true</property>
</session-factory>
spy.properties
Замените real driver
на существующий драйвер JDBC MySQL
realdriver=com.mysql.jdbc.Driver
#specifies another driver to use
realdriver2=
#specifies a third driver to use
realdriver3=
Измените местоположение файла журнала Измените местоположение файла журнала в свойстве logfile, все инструкции SQL будут входить в этот файл.
Окна
logfile = c:/spy.log
* Никс
logfile = /srv/log/spy.log
"spy.properties"
в проект classpathСкопируйте "spy.properties"
в корневую папку проекта, убедитесь, что ваш проект может найти "spy.properties", иначе он предложит "spy.properties"
не найденное исключение файла.
Все ответы здесь полезны, но если вы используете XML-интерфейс приложения Spring для настройки сеанса factory, установка переменной уровня SQL log4j позволяет вам только часть вашего пути, вы также имеете для установки переменной hibernate.show_sql в самом контексте приложения, чтобы заставить Hibernate начать фактическое отображение значений.
ApplicationContext.xml имеет:
<property name="hibernateProperties">
<value>
hibernate.jdbc.batch_size=25
... <!-- Other parameter values here -->
hibernate.show_sql=true
</value>
</property>
И ваш файл log4j нуждается в
log4j.logger.org.hibernate.SQL=DEBUG
В Java:
Преобразуйте ваш запрос в TypedQuery, если это CriteriaQuery (javax.persistence).
Затем:
query.unwrap(org.hibernate.Query.class).getQueryString();
Hibernate показывает запрос и значения его параметров в разных строках.
Если вы используете application.properties при весенней загрузке и можете использовать ниже выделенный параметр в application.properties.
org.hibernate.SQL покажет запросы
org.hibernate.type покажет все значения параметров, которые будут сопоставлены с запросами выбора, вставки и обновления. logging.level.org.hibernate.type = TRACE
org.hibernate.type.EnumType покажет значение параметра типа enum
пример ::
2018-06-14 11:06:28,217 TRACE [main] [EnumType.java : 321] Binding [active] to parameter: [1]
sql.BasicBinder покажет целое, varchar, значение параметра логического типа
пример ::
Самым простым решением для меня является реализация обычного stringReplace для замены входных параметров на значения параметров (для простоты трактуя все параметры как строку):
String debugedSql = sql;
//then, for each named parameter
debugedSql = debugedSql.replaceAll(":"+key, "'"+value.toString()+"'");
//and finnaly
println(debugedSql);
или что-то подобное для позиционных параметров (?).
Позаботьтесь о пустых значениях и конкретных типах значений, таких как дата, если вы хотите, чтобы готовый SQL файл был записан в журнал.
для разработки с Wildfly (standalone.xml), добавьте эти логгеры:
<logger category="org.hibernate.SQL">
<level name="INFO"/>
</logger>
<logger category="org.hibernate.type.descriptor.sql">
<level name="INFO"/>
</logger>
Если вы используете весеннюю загрузку и jpa
spring.jpa.properties.hibernate.show_sql=false
говорит спящий, чтобы скрыть логи
Похоже, истина по умолчанию!