524 Stimmen

Wie drucke ich eine Abfragezeichenfolge mit Parameterwerten bei Verwendung von Hibernate?

Ist es in Hibernate möglich, generierte SQL-Abfragen mit echten Werten anstelle von Fragezeichen zu drucken?

Wie würden Sie vorschlagen, um Abfragen mit echten Werten zu drucken, wenn es nicht möglich ist, mit Hibernate API?

3voto

clevertension Punkte 6588

Der MySQL JDBC-Treiber bietet bereits eine praktische Funktion, um diese Anforderung zu erfüllen. Sie müssen mindestens die JAR-Version größer oder gleich 5.1.6 haben (z.B. mysql-connect-jar-5.1.6.jar )

  1. Konfigurieren Sie jdbc.url um Ihren Logger und die benutzerdefinierte Protokollierung hinzuzufügen:

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

Sie verwendet slf4j Protokollierung, wenn Ihre Standardprotokollierung auf log4j müssen Sie hinzufügen slf4j-api y slf4j-log4j12 als Abhängigkeiten zu verwenden slf4j Protokollierung:

  1. Schreiben Sie Ihren eigenen Protokollierungscode:

    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 his.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();
        }
    }

3voto

Vijay Bhatt Punkte 1341

Wenn Sie möchten, dass Hibernate generierte SQL-Abfragen mit echten Werten anstelle von Fragezeichen ausgibt, fügen Sie folgende Einträge zu hibernate.cfg.xml/hibernate.properties :

show_sql=true
format_sql=true
use_sql_comments=true

Und fügen Sie folgende Einträge zu 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

3voto

Suneet Khurana Punkte 351

Hibernate zeigt Abfragen und ihre Parameterwerte in verschiedenen Zeilen an.

Wenn Sie Folgendes verwenden application.properties in Spring Boot und Sie können den unten hervorgehobenen Parameter in application.properties .

  • org.hibernate.SQL werden Abfragen angezeigt:

    logging.level.org.hibernate.SQL=DEBUG
  • org.hibernate.type werden alle Parameterwerte angezeigt, die mit select , insert y update Rückfragen.

    logging.level.org.hibernate.type=TRACE
  • org.hibernate.type.EnumType zeigt den Wert des Enum-Parameters an:

    logging.level.org.hibernate.type.EnumType=TRACE

    Beispielhafte Ausgabe:

    2018-06-14 11:06:28,217 TRACE [main] [EnumType.java : 321] Binding [active] to parameter: [1]
  • sql.BasicBinder zeigt Parameterwerte vom Typ Integer, Varchar und Boolean an

    logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE

    Beispielhafte Ausgabe:

    * 2018-06-14 11:28:29,750 TRACE [http-nio-9891-exec-2] [BasicBinder.java : 65] binding parameter [1] as [BOOLEAN] - [true]
    * 2018-06-14 11:28:29,751 TRACE [http-nio-9891-exec-2] [BasicBinder.java : 65] binding parameter [2] as [INTEGER] - [1]
    * 2018-06-14 11:28:29,752 TRACE [http-nio-9891-exec-2] [BasicBinder.java : 65] binding parameter [3] as [VARCHAR] - [public]

3voto

zime Punkte 171

Die Lösung ist korrekt, protokolliert aber auch alle Bindungen für die Ergebnisobjekte. Um dies zu verhindern, ist es möglich, einen separaten Appender zu erstellen und die Filterung zu aktivieren. Zum Beispiel:

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

2voto

Mithun Khatri Punkte 588

Log4Jdbc Plugin wäre für Ihre Anforderungen am besten geeignet. Es zeigt folgendes an

1. Complete SQL query being hit to the db
2. Parameter values being passed to the query
3. Execution time taken by each query

Siehe untenstehenden Link zur Konfiguration von Log4Jdbc-

https://code.google.com/p/log4jdbc/

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X