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?

10voto

ravshansbox Punkte 704

Fügen Sie Folgendes zu Ihrer log4j- oder logback-Konfiguration hinzu:

org.hibernate.sql=DEBUG
org.hibernate.type.descriptor.sql.BasicBinder=TRACE

10voto

Michal Z m u d a Punkte 5062

Sie können der Datei log4j.xml Zeilen für Kategorien hinzufügen:

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

und fügen Sie Hibernate-Eigenschaften hinzu:

<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="use_sql_comments">true</property>

9voto

Vlad Mihalcea Punkte 121171

Sie können dies mit der Option datenquellen-proxy wie ich es in diese Stelle .

Angenommen, Ihre Anwendung erwartet eine dataSource Bohne (z.B. über @Resource ), so können Sie Folgendes konfigurieren 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"/>

Nun die Hibernate-Ausgabe im Vergleich zum Datenquellen-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]}

Le site datasource-proxy Abfragen Parameterwerte enthalten, und Sie können sogar benutzerdefinierte JDBC-Anweisungs-Interceptoren hinzufügen, so dass Sie Abfangen von N+1 Abfrageproblemen direkt in Ihren Integrationstests .

5voto

womd Punkte 2664

Für die Entwicklung mit Wildfly ( standalone.xml ), fügen Sie diese Logger hinzu:

<logger category="org.hibernate.SQL">
   <level name="DEBUG"/>
</logger>
<logger category="org.hibernate.type.descriptor.sql">
   <level name="TRACE"/>
</logger>

5voto

flybywire Punkte 245586

Schalten Sie die org.hibernate.type Logger, um zu sehen, wie die aktuellen Parameter mit den Fragezeichen verbunden sind.

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