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?

1voto

Frédéric Nell Punkte 101

In Java:

Transformieren Sie Ihre Abfrage in TypedQuery, wenn es eine CriteriaQuery ist (javax.persistence).

Dann:

query.unwrap(org.hibernate.Query.class).getQueryString();

1voto

diy Punkte 3450

Wenn Sie hibernate 3.2.X verwenden, benutzen Sie dies:

log4j.logger.org.hibernate.SQL=trace

stattdessen:

log4j.logger.org.hibernate.SQL=debug

0voto

harsha kumar Reddy Punkte 1071

Wenn Sie spring-boot verwenden, können Sie die log4jdbc-spring-boot-starter-Abhängigkeit verwenden, die ein Fork von org.bgee.log4jdbc-log4j2 ist.

En pom.xml Ich habe die folgende Abhängigkeit verwendet:

   <dependency>
        <groupId>com.integralblue</groupId>
        <artifactId>log4jdbc-spring-boot-starter</artifactId>
        <version>2.0.0</version>
    </dependency>

In der Dokumentation wird erwähnt, dass die SQL-Protokollierung nicht funktioniert, wenn Sie nur diese Abhängigkeit einbeziehen, wir müssen folgende Eigenschaft in application.properties angeben

logging.level.jdbc.sqlonly=INFO

sondern mit

Version 2.0.0, alle Protokollierungseigenschaften sind standardmäßig auf "info" eingestellt. Zum Zeitpunkt des Schreibens dieser Antwort ist die Nutzungszahl für 2.0.0 im Vergleich zu 1.0.2 geringer

In Version 2.0.0 werden die folgenden Eigenschaften standardmäßig gesetzt, auch wenn Sie keine Eigenschaften für die Sql-Protokollierung angeben

logging.level.jdbc.sqlonly=INFO
logging.level.jdbc.resultset=INFO
logging.level.jdbc.connection=INFO
logging.level.jdbc.resultsettable=INFO
logging.level.jdbc.audit=INFO
logging.level.jdbc.sqltiming=INFO

Wenn Sie also möchten, dass nur SQL-Abfragen mit ? gedruckt werden, die durch tatsächliche Werte ersetzt werden, und wenn Sie unnötige Protokollierung von Ergebnissen vermeiden möchten, setzen Sie diese Eigenschaften explizit auf

logging.level.jdbc.sqlonly=INFO
logging.level.jdbc.resultset=OFF
logging.level.jdbc.connection=OFF
logging.level.jdbc.resultsettable=OFF
logging.level.jdbc.audit=OFF
logging.level.jdbc.sqltiming=OFF

0voto

ayman.mostafa Punkte 301

Müssen Sie wie folgt konfigurieren:

# Hibernate logging options (INFO only shows startup messages)
log4j.logger.org.hibernate=INFO

# Log JDBC bind parameter runtime arguments
log4j.logger.org.hibernate.type=trace

0voto

xenoterracide Punkte 14896

Ich hatte mit allen Antworten hier Probleme. Keine von ihnen gab mir tatsächlich Parameter für die Spring Data JPA-Abfrage, die ein Enum als PK übergeben wurde.

Für Hibernate 5.3:

    <!-- silence the noise -->
    <Logger name="org.hibernate.search.engine.metadata.impl" additivity="false"/>
    <Logger name="org.hibernate.boot.internal" additivity="false"/>
    <Logger name="org.hibernate.engine.internal" additivity="false"/>
    <Logger name="org.hibernate.engine.jdbc" additivity="false"/>
    <Logger name="org.hibernate.engine.transaction" additivity="false"/>
    <Logger name="org.hibernate.engine.loading.internal" additivity="false"/>
    <Logger name="org.hibernate.engine.spi.CollectionEntry" additivity="false"/>
    <Logger name="org.hibernate.engine.query.spi.HQLQueryPlan" additivity="false"/>
    <Logger name="org.hibernate.engine.query.spi.QueryPlanCache" additivity="false"/>
    <Logger name="org.hibernate.engine.spi.IdentifierValue" additivity="false"/>
    <Logger name="org.hibernate.engine.spi.CascadingActions" additivity="false"/>
    <Logger name="org.hibernate.engine.spi.ActionQueue" additivity="false"/>
    <Logger name="org.jboss.logging"/>

    <Logger name="org.hibernate.SQL" level="debug" additivity="false">
      <AppenderRef ref="Console"/>
    </Logger>
    <Logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="trace" additivity="false">
      <AppenderRef ref="Console"/>
    </Logger>
    <Logger name="org.hibernate.engine" level="trace" additivity="false">
      <AppenderRef ref="Console"/>
    </Logger>

Mit hibernate.format_sql eingestellt auf true für den hübschen Druck, dies ist ein Beispiel für meine Ausgabe:

17:00:00,664 [TRACE] Named parameters: {1=DE} [main] org.hibernate.engine.spi.QueryParameters.traceParameters(QueryParameters.java:325) 
17:00:00,671 [DEBUG] 
    select
        countrysub0_.code as code1_23_,
        countrysub0_1_.country_subdivision as country_1_61_ 
    from
        country_subdivision countrysub0_ 
    left outer join
        jurisdiction_country_subdivision countrysub0_1_ 
            on countrysub0_.code=countrysub0_1_.jurisdiction 
    where
        countrysub0_.code=? [main] org.hibernate.engine.jdbc.spi.SqlStatementLogger.logStatement(SqlStatementLogger.java:103) 

Ich habe versucht, einfach die org.hibernate.engine.spi.QueryParameters a trace aber aus irgendeinem Grund wurden die benannten Parameter immer unterdrückt, also habe ich stattdessen alles andere unterdrückt, was protokolliert wurde. Es scheint aber nicht alle Parameter zu protokollieren, also brauchte ich immer noch die BasicBinding auch das Protokoll.

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