Hazırda Beklet'te oluşturulan SQL sorgularını soru işaretleri yerine gerçek değerlerle yazdırmak mümkün mü?
Hazırda Bekletme API'sı ile mümkün değilse sorguları gerçek değerlerle yazdırmayı nasıl önerirsiniz?
Hazırda Beklet'te oluşturulan SQL sorgularını soru işaretleri yerine gerçek değerlerle yazdırmak mümkün mü?
Hazırda Bekletme API'sı ile mümkün değilse sorguları gerçek değerlerle yazdırmayı nasıl önerirsiniz?
Yanıtlar:
Aşağıdaki kategoriler için günlüğe kaydetmeyi etkinleştirmeniz gerekir :
org.hibernate.SQL
- debug
yürütülürken tüm SQL DML deyimlerini günlüğe kaydetmek içinorg.hibernate.type
- trace
tüm JDBC parametrelerini günlüğe kaydetmek içinYani bir log4j yapılandırması şöyle görünebilir:
# logs the SQL statements
log4j.logger.org.hibernate.SQL=debug
# Logs the JDBC parameters passed to a query
log4j.logger.org.hibernate.type=trace
Birincisi hibernate.show_sql=true
eski özelliğe eşdeğerdir , ikincisi bağlı parametreleri diğer şeylere yazdırır.
Başka bir çözüm (hazırda bekleme tabanlı olmayan), P6Spy gibi bir JDBC proxy sürücüsü kullanmak olacaktır .
org.hibernate.type.descriptor.sql.BasicBinder
günlükçüyü kullanabiliriz . Oturum açmayı etkinleştirmek org.hibernate.type
benim için çok işe yaramaz bilgiler yazdırdı ...
org.hibernate.type
ve org.hibernate.loader.hql
parametreleri göstermek için benim için çalışmıyor
Yalnızca kolaylık olması açısından, Logback (SLF4J) için aynı yapılandırma örneği aşağıdadır
<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>
Sonra sql.log (örnek) çıktısı şöyle görünür:
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
Şununla hibernate.cfg.xml
değiştir:
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="use_sql_comments">true</property>
"Log4j.properties" dosyasına log4j ve aşağıdaki girişleri ekleyin:
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
binding parameter [1] as [VARCHAR] - [1]
.
Yaylı önyükleme kullanılıyorsa, bunu yapılandırın:
aplication.yml
logging:
level:
org.hibernate.SQL: DEBUG
org.hibernate.type: TRACE
aplication.properties
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type=TRACE
ve daha fazlası değil.
HTH
Log4JDBC, veritabanına giden tam SQL'i, burada bunu yapmayan en popüler cevap yerine yerine parametrelerle basan güzel bir çözümdür . Bunun en büyük kolaylıklarından biri, SQL'i doğrudan DB ön ucunuza kopyalayabilmeniz ve olduğu gibi çalıştırabilmenizdir.
http://log4jdbc.sourceforge.net/
https://code.google.com/p/log4jdbc-remix/
İkincisi ayrıca sorgu sonuçlarının tablo şeklinde bir sunumunu verir.
Sorgudaki sonuç kümesi tablosu ile birlikte parametreler ile oluşturulan SQL'i gösteren örnek çıktı:
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 - |---|--------|--------|-----------|----------|---------|-------|
En son SLF4j ve logback ile log4jdbc -log4j2 ( https://code.google.com/archive/p/log4jdbc-log4j2/ ) kullanıyorum. Kurulumum için gerekli maven bağımlılıkları aşağıdaki gibidir:
<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>
Sürücü ve DB URL'leri şöyle görünür:
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
Logback.xml yapılandırma dosyam aşağıdaki gibi görünüyor: Bu, tüm SQL ifadelerini parametrelerle birlikte artı tüm sorgular için sonuç kümesi tablolarını çıkarır.
<?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>
Son olarak, sınıfyolunun kökünde log4jdbc.log4j2.properties adlı bir dosya oluşturmak zorunda kaldım, örneğin bir Mevn projesinde src / test / resources veya src / main / resources. Bu dosya aşağıdaki gibi bir satıra sahiptir:
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
Yukarıdakiler günlük kitaplığınıza bağlı olacaktır. Daha fazla bilgi için https://code.google.com/archive/p/log4jdbc-log4j2 adresindeki dokümanlara bakın.
Örnek Çıktı:
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 dosyasına kategori satırları ekleyebilirsiniz:
<category name="org.hibernate.type">
<priority value="TRACE"/>
</category>
ve hazırda bekletme özelliklerini ekleyin:
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="use_sql_comments">true</property>
log4j veya logback yapılandırmanıza aşağıdaki özellikleri ve değerleri ekleyin:
org.hibernate.sql=DEBUG
org.hibernate.type.descriptor.sql.BasicBinder=TRACE
org.hibernate.type.descriptor.sql.BasicBinder
Kategori tüm parametreleri, örneğin enum türleri içermez. Eğer her şeyi istiyorsanız, gerçekten TRACE
tüm org.hibernate.type
gruba ihtiyacınız var .
Sen kullanarak bunu yapabilirsiniz veri kaynağı-vekil ben de açıklandığı gibi, bu yazı .
Uygulamanızın bir dataSource
fasulye (ör. Yoluyla @Resource
) beklediğini varsayarsak , şu şekilde yapılandırabilirsiniz 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"/>
Şimdi Hibernate çıkışı 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
Sorguları parametre değerleri içeren ve böylece bile özel JDBC deyimi önleyicilerin ekleyebilir sağ entegrasyon testlerinden N + 1 sorgu sorunları yakalamak .
açmak org.hibernate.type
fiili parametreler soru işaretleri bağlamak nasıl görmek için Logger.
<!-- 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>
Çözüm doğrudur, ancak sonuç nesneleri için tüm bağlantıları günlüğe kaydeder. Bunu önlemek için ayrı bir ekleyici oluşturmak ve filtrelemeyi etkinleştirmek mümkündür, örneğin:
<!-- 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>
**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
Bu cevap soru için biraz sapma. Bazen, sql'a yalnızca çalışma zamanında hata ayıklama amacıyla ihtiyaç duyarız. Bu durumda, editörlerde hata ayıklama kullanmanın daha kolay bir yolu vardır.
Bu hazırda bekletme 3 içindir. Diğer sürümlerde çalıştığından emin değilim.
mysql jdbc sürücüsü zaten bu gereksinimi karşılamak için uygun bir sağladı, en azından kavanoz sürümüne sahip olmalısınız> = mysql-connect-jar-5.1.6.jar
1. adım: [jdbc.url dosyanızı günlükçü ve özel günlük kaydı eklemek üzere yapılandırın]
jdbc.url=jdbc:mysql://host:port/your_db?logger=com.mysql.jdbc.log.Slf4JLogger&profileSQL=true&profilerEventHandler=com.xxx.CustomLoggingProfilerEventHandler
şimdi, slf4j günlüğü kullanıyor, varsayılan günlüğünüz log4j ise, slf4j günlüğünü kullanmak için slf4j-api, slf4j-log4j12 bağımlılıkları eklemelisiniz
2. adım: [özel günlüğünüzü yazın]
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 için bunu beğendim:
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
İstediğiniz ya da ben bir süre önce istedi ama ama tam eserler açılıyor P6Spy çalışır mükemmel ,
İşte P6Spy için MKYONG öğretici uygulamak için basit bir öğretici .
benim için cazibe gibi çalıştı.
“P6spy-install.jar” dosyasını edinin
p6spy-install.jar
Dosyayı çıkarın , arayın p6spy.jar
vespy.properties
p6spy.jar
Proje kitaplığı bağımlılığınıza ekleyin
Veritabanı yapılandırma dosyanızı değiştirin. Mevcut JDBC sürücünüzü P6Spy JDBC sürücüsüyle değiştirmeniz gerekir -com.p6spy.engine.spy.P6SpyDriver
Orijinal MySQL JDBC sürücüsüdür - 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 sürücüsüne değiştirildi - 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>
spy.properties
Değiştir real driver
mevcut MySQL JDBC sürücüsü ile
realdriver=com.mysql.jdbc.Driver
#specifies another driver to use
realdriver2=
#specifies a third driver to use
realdriver3=
Günlük dosyası konumunu değiştirme Günlük dosyası özelliğinde günlük dosyası konumunu değiştirin, tüm SQL ifadeleri bu dosyaya oturum açar.
pencereler
logfile = c:/spy.log
* nix
logfile = /srv/log/spy.log
“spy.properties”
Proje sınıfyoluna kopyalaKopya “spy.properties”
proje kök klasörüne emin proje, aksi takdirde istemi olacak “spy.properties” bulabilir hale “spy.properties”
dosya bulunamadı istisna.
<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>
Hazırda Bekletme 4 ve slf4j / log4j2 kullanarak, log4j2.xml yapılandırmamda aşağıdakileri eklemeyi denedim:
<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>
Ama başarılı olamadı.
İçinden öğrendim bu konuya gerekli hazırda kullandığı jboss-günlüğü çerçeve slf4j yoluyla giriş yapmak için yapılandırılacak söyledi. Uygulamanın VM bağımsız değişkenlerine aşağıdaki bağımsız değişkeni ekledim:
-Dorg.jboss.logging.provider=slf4j
Ve bir cazibe gibi çalıştı.
Benim için işe yarayan, log4j.file dosyasında aşağıda belirtilen özellik:
log4j.logger.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
Hazırda bekletme özellikleri ayarları:
hibernate.show_sql=true
Bunu günlüğe kaydedebilirsiniz:
net.sf.hibernate.hql.QueryTranslator
Çıktı örneği:
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 eklentisi gereksiniminiz için en iyi olurdu. Aşağıdaki gösterir-
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- yapılandırmak için aşağıdaki bağlantıya bakın
https://code.google.com/p/log4jdbc/
Wireshark kullanın veya benzeri bir şey :
Yukarıda belirtilen cevapların hiçbiri sql parametrelerini düzgün bir şekilde yazdırmaz veya bir ağrı değildir. Bunu uygulamadan Oracle / Mysql vb. Sorgulara gönderilen tüm sql / komutlarını yakalayan WireShark kullanarak başardım .
Buradaki tüm yanıtlar yararlıdır, ancak oturum fabrikanızı ayarlamak için bir Spring uygulama bağlamı XML kullanıyorsanız, log4j SQL düzey değişkenini ayarlamak sizi oraya sadece bir parçayla getirir, ayrıca hibernate.show_sql değişkenini de ayarlamanız gerekir Hibernate'in gerçekte değerleri göstermeye başlamasını sağlamak için uygulama bağlamında.
ApplicationContext.xml dosyasında şunlar vardır:
<property name="hibernateProperties">
<value>
hibernate.jdbc.batch_size=25
... <!-- Other parameter values here -->
hibernate.show_sql=true
</value>
</property>
Ve log4j dosyanızın
log4j.logger.org.hibernate.SQL=DEBUG
Java dilinde:
Sorgunuzu bir CriteriaQuery (javax.persistence) ise TypedQuery'de dönüştürün.
Sonra:
query.unwrap (org.hibernate.Query.class) .getQueryString ();
Hazırda Beklet, sorguyu ve parametre değerlerini farklı satırlarda gösterir.
Spring boot içinde application.properties kullanıyorsanız ve application.properties içinde aşağıda vurgulanan parametreyi kullanabilirsiniz.
org.hibernate.SQL sorguları gösterecektir
org.hibernate.type, seçme, ekleme ve güncelleme sorgularıyla eşlenecek tüm parametre değerlerini gösterir. logging.level.org.hibernate.type = TRACE
org.hibernate.type.EnumType enum tipi parametre değerini gösterecektir
misal ::
2018-06-14 11:06:28,217 TRACE [main] [EnumType.java : 321] Binding [active] to parameter: [1]
sql.BasicBinder tamsayı, varchar, boolean tip parametre değerini gösterecektir
misal ::
Benim için en basit çözüm, parametre girişlerini parametre değerleriyle değiştirmek için normal bir stringReplace uygulamaktır (basitlik için tüm parametreleri dize olarak ele alıyor):
String debugedSql = sql;
//then, for each named parameter
debugedSql = debugedSql.replaceAll(":"+key, "'"+value.toString()+"'");
//and finnaly
println(debugedSql);
veya konumsal parametreler için benzer bir şey (?).
Çalışmaya hazır bir sql günlüğünün kaydedilmesini istiyorsanız, null değerlere ve tarih gibi belirli değer türlerine dikkat edin.