Как распечатать строку запроса со значениями параметров при использовании Hibernate

возможно ли в спящем режиме печатать сгенерированные SQL-запросы с реальными значениями вместо вопросительных знаков?

Как бы вы предложили печатать запросы с реальными значениями, если это невозможно с помощью Hibernate API?

27 ответов


вам нужно включить лесозаготовки для следующих категорий:

  • 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 наследие свойства, второй печатает связанные параметры среди других вещи.

другое решение (не на основе гибернации) было бы использовать драйвер прокси-сервера JDBC, такой как P6Spy.


просто для удобства, вот тот же пример конфигурации для 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.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] - MatchingStep@com.mypackage.foo
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.свойства":

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 прямо в свой интерфейс БД и выполнить как есть.

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  - |---|--------|--------|-----------|----------|---------|-------|

обновление 2016

совсем недавно я использовал 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 #MySQL

мой Logback так.файл конфигурации xml выглядит следующим образом: это выводит все операторы SQL с параметрами плюс таблицы resultset для всех запросов.

<?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.свойства в корне classpath, который, например, в src/тест/ресурсов или src/основных/ресурсов в проекте 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 |
|----------|---|---|----------|--------|---|-----|
|----------|---|---|----------|--------|---|-----|

вы можете добавить строки категории в log4j.xml:

<category name="org.hibernate.type">
    <priority value="TRACE"/>
</category>

и добавить свойства hibernate:

<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

в случае использования spring boot просто настройте это:

применение.в формате YML

logging:
  level:
    org.hibernate.SQL: DEBUG
    org.hibernate.type: TRACE

применение.свойства

logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type=TRACE

и ничего больше.

HTH


поворот на org.hibernate.type Logger, чтобы увидеть, как фактические параметры привязываются к вопросительным знакам.


вы можете сделать это с помощью источник данных-прокси, как я описал в этот пост.

предполагая, что ваше приложение ожидает dataSource bean (например, via @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, чтобы вы могли catch N+1 вопросы запроса прямо из ваших интеграционных тестов.


**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

<!-- 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>


этот ответ немного отличается от вопроса. Иногда нам нужен sql только для отладки во время выполнения. В этом случае есть более простой способ, используя debug on editors.

  • поставьте точку останова на org.зимовать.погрузчик.Погрузчик.loadEntityBatch (или перейдите на стек, пока есть);
  • когда выполнение приостановлено, посмотрите значение переменной this.в SQL ;

Это для спящего режима 3. Я не уверен, что это работает на других версии.


решение правильное, но регистрирует также все привязки для объектов результата. Чтобы предотвратить это, можно создать отдельный аппендер и включить фильтрацию, например:

<!-- 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>

Мне нравится это для 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, используемая hibernate, должна быть настроена для входа через slf4j. Я добавил следующий аргумент к аргументам VM приложения:

-Dorg.jboss.logging.provider=slf4j

и он работал как шарм.


MySQL JDBC driver уже предоставляет удобный для удовлетворения этого требования, вы должны, по крайней мере, иметь версию jar >= mysql-connect-jar-5.1.6.Джар

Шаг 1: [настройте jdbc.url для добавления регистратора и пользовательского ведения журнала]

    jdbc.url=jdbc:mysql://host:port/your_db?logger=com.mysql.jdbc.log.Slf4JLogger&profileSQL=true&profilerEventHandler=com.xxx.CustomLoggingProfilerEventHandler

теперь он использует slf4j logging, если ваш журнал по умолчанию log4j, вы должны добавить зависимости slf4j-api, slf4j-log4j12 для использования slf4j logging

Шаг 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.файл:

log4j.logger.org.hibernate.type.descriptor.sql.BasicBinder=TRACE

настройки свойства спящий режим :

hibernate.show_sql=true

Если вы используете hibernate 3.2.обман использовать

log4j.logger.org.hibernate.SQL=trace

вместо

log4j.logger.org.hibernate.SQL=debug 

вы можете зарегистрировать это:

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.

для меня это сработало как шарм.

  1. скачать библиотеку P6Spy

скачать "p6spy-установить.jar"

  1. экстракт это

извлечь искать p6spy.jar и spy.properties

  1. добавить зависимость библиотека

добавить p6spy.jar в зависимости от библиотеки проекта

  1. изменить файл свойств P6Spy

измените файл конфигурации базы данных. Вам нужно заменить существующий драйвер 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>
  1. изменить файл свойств P6Spy Измените файл свойств P6Spy -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

* nix

logfile     = /srv/log/spy.log
  1. скопировать “spy.properties” в classpath проекта

скопировать “spy.properties” в корневую папку проекта, убедитесь, что ваш проект может найти "шпиона.свойства", иначе он подскажет “spy.properties” файл не найден исключение.


использовать Wireshark или что-то подобное:

ни один из вышеупомянутых ответов не будет печатать sql с параметрами должным образом или является болью. Я достиг этого, используя помощью Wireshark, который захватывает все sql / команды, отправляемые из приложения в Oracle / Mysql и т. д. с запросами.


все ответы здесь полезны, но если вы используете контекст приложения Spring XML для настройки фабрики сеансов, установка переменной уровня SQL log4j получает только часть пути туда, вам также нужно установить спящий режим.переменная 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.стойкость.)

затем:

запрос.unwrap (org.зимовать.Запрос.класс.)getQueryString();


Hibernate показывает запрос и их значения параметров в разных строках.

Если вы используете приложения.свойства в spring boot, и вы можете использовать ниже выделенный параметр в приложении.свойства.

  1. org.зимовать.SQL покажет запросы

    лесозаготовки.уровне.орг.гибернации.В SQL= "ОТЛАДКА"

  2. org.зимовать.type покажет все значения параметров, которые будут сопоставляться с select, insert и update запросы. ведение журнала.уровень.орг.спячка.type=TRACE

    • org.зимовать.тип.EnumType покажет значение параметра типа перечисления

      лесозаготовки.уровне.орг.гибернации.тип.Значение параметра enumtype=след

      пример:

      2018-06-14 11:06:28,217 TRACE [main] [EnumType.java : 321] Binding [active] to parameter: [1]
      
    • sql.BasicBinder покажет значение параметра integer, varchar, boolean type

      лесозаготовки.уровне.орг.гибернации.тип.описатель.для SQL.BasicBinder=след

      пример ::

      • 2018-06-14 11: 28: 29,750 трассировка [http-nio-9891-exec-2] [BasicBinder.java: 65] параметр привязки [1] Как [BOOLEAN] - [true]
      • 2018-06-14 11: 28: 29,751 трассировка [http-nio-9891-exec-2] [BasicBinder.java: 65] параметр привязки [2] как [целое число] - [1]
      • 2018-06-14 11: 28: 29,752 трассировка [http-nio-9891-exec-2] [BasicBinder.java: 65] параметр привязки [3] как [VARCHAR] - [public]

самым простым решением для меня является реализация регулярного stringReplace для замены входных параметров значениями параметров (для простоты все параметры обрабатываются как строка):

 String debugedSql = sql;
 //then, for each named parameter
     debugedSql = debugedSql.replaceAll(":"+key, "'"+value.toString()+"'");
 //and finnaly
 println(debugedSql);

или что-то подобное для позиционных параметров (?).
Позаботьтесь о нулевых значениях и конкретных типах значений, таких как date, если вы хотите, чтобы выполнить готовый sql для регистрации.