Как напечатать строку запроса со значениями параметров при использовании Hibernate - PullRequest
339 голосов
/ 10 ноября 2009

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

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

Ответы [ 29 ]

3 голосов
/ 23 марта 2012

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

<!-- 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>
3 голосов
/ 04 марта 2015
**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
3 голосов
/ 30 июня 2016

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

  • Поместить точку останова в org.hibernate.loader.Loader.loadEntityBatch (или перемещаться по стеку, пока там не будет);
  • Когда выполнение приостановлено, посмотрите значение переменной this.sql;

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

2 голосов
/ 01 августа 2017

Вот что у меня сработало, установите свойство ниже в файле log4j.file:

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

Настройки свойств Hibernate:

hibernate.show_sql=true
2 голосов
/ 18 мая 2017

Драйвер 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();
    }

}
2 голосов
/ 25 марта 2016

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

2 голосов
/ 21 июня 2016

Используя 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. Я добавил следующий аргумент к аргументам виртуальной машины приложения:

-Dorg.jboss.logging.provider=slf4j

И это сработало как шарм.

2 голосов
/ 26 октября 2013

Мне нравится это для 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 
1 голос
/ 11 ноября 2009

если вы используете Hibernate 3.2.xx использовать

log4j.logger.org.hibernate.SQL=trace

вместо

log4j.logger.org.hibernate.SQL=debug 
1 голос
/ 05 сентября 2014

Плагин 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/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...