在Hibernate中是否可以使用实际值而不是问号打印生成的SQL查询?
如果使用Hibernate API无法打印具有实际值的查询,您会建议如何?
答案 0 :(得分:373)
您需要为以下类别启用logging:
org.hibernate.SQL
- 设置为debug
以记录执行时的所有SQL DML语句org.hibernate.type
- 设置为trace
以记录所有JDBC参数因此log4j配置可能如下所示:
# logs the SQL statements
log4j.logger.org.hibernate.SQL=debug
# Logs the JDBC parameters passed to a query
log4j.logger.org.hibernate.type=trace
第一个相当于hibernate.show_sql=true
遗产property,第二个打印绑定参数等。
另一种解决方案(非基于hibernate)将使用像P6Spy这样的JDBC代理驱动程序。
答案 1 :(得分:62)
为方便起见,这里是Logback(SLF4J)
的相同配置示例<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>
sql.log(示例)中的输出如下所示:
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
答案 2 :(得分:29)
将hibernate.cfg.xml
更改为:
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="use_sql_comments">true</property>
在“log4j.properties”中包含log4j及以下条目:
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 :(得分:15)
Log4JDBC是一个很好的解决方案,它打印完全 SQL到数据库的参数到位,而不是这里最常用的答案。这样做的一个主要方便是您可以将SQL直接复制到数据库前端并按原样执行。
http://log4jdbc.sourceforge.net/
https://code.google.com/p/log4jdbc-remix/
后者还输出查询结果的表格表示。
示例输出显示生成的SQL,其中包含params以及来自查询的结果集表:
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 - |---|--------|--------|-----------|----------|---------|-------|
最近我使用了log4jdbc-log4j2(https://code.google.com/archive/p/log4jdbc-log4j2/)和SLF4j以及logback。我的设置所需的Maven依赖关系如下:
<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>
然后,驱动程序和数据库网址如下所示:
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配置文件如下所示:这将输出所有带参数的SQL语句以及所有查询的结果集表。
<?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>
最后,我必须在类路径的根目录下创建名为log4jdbc.log4j2.properties的文件,例如Mevn项目中的src / test / resources或src / main / resources。这个文件有一行,如下所示:
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
以上内容取决于您的日志记录库。有关详细信息,请参阅https://code.google.com/archive/p/log4jdbc-log4j2处的文档
示例输出:
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 |
|----------|---|---|----------|--------|---|-----|
|----------|---|---|----------|--------|---|-----|
答案 4 :(得分:11)
如果正在使用spring boot,请配置:
<强> 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
,仅此而已。
HTH
答案 5 :(得分:9)
您可以向log4j.xml添加类别行:
<category name="org.hibernate.type">
<priority value="TRACE"/>
</category>
并添加hibernate属性:
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="use_sql_comments">true</property>
答案 6 :(得分:7)
您可以使用datasource-proxy执行此操作,如我在this post中所述。
假设您的应用程序需要dataSource
bean(例如通过@Resource
),这就是配置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"/>
现在Hibernate输出与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
查询包含参数值,您甚至可以添加自定义JDBC语句拦截器,以便catch N+1 query issues right from your integration tests。
答案 7 :(得分:7)
将以下属性和值添加到log4j或logback配置中:
org.hibernate.sql=DEBUG
org.hibernate.type.descriptor.sql.BasicBinder=TRACE
答案 8 :(得分:5)
打开org.hibernate.type
记录器,查看实际参数如何绑定到问号。
答案 9 :(得分:4)
<!-- 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>
答案 10 :(得分:3)
**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
答案 11 :(得分:3)
解决方案是正确的,但也记录了结果对象的所有绑定。 为了防止这种情况,可以创建一个单独的appender并启用过滤,例如:
<!-- 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>
答案 12 :(得分:3)
这个答案对于这个问题有点不一致。 有时,我们只需要在运行时将sql用于调试目的。 在这种情况下,使用编辑器上的调试有一种更简单的方法。
这是针对休眠3.我不确定这是否适用于其他版本。
答案 13 :(得分:2)
我喜欢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
答案 14 :(得分:2)
这对我有用,在log4j.file中设置下面的属性:
log4j.logger.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
Hibernate属性设置:
hibernate.show_sql=true
答案 15 :(得分:2)
mysql jdbc驱动已经提供了方便的满足这个要求,你必须至少有jar版本&gt; = 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();
}
}
答案 16 :(得分:2)
<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>
答案 17 :(得分:2)
使用Hibernate 4和slf4j / log4j2,我尝试在log4j2.xml配置中添加以下内容:
host
但没有成功。
我通过this thread发现需要配置hibernate使用的jboss-logging框架才能登录slf4j。我将以下参数添加到应用程序的VM参数中:
PHP
它就像一个魅力。
答案 18 :(得分:1)
如果你使用的是hibernate 3.2.xx 使用
log4j.logger.org.hibernate.SQL=trace
而不是
log4j.logger.org.hibernate.SQL=debug
答案 19 :(得分:1)
您可以记录下来:
net.sf.hibernate.hql.QueryTranslator
输出示例:
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 )
答案 20 :(得分:1)
这里的所有答案都很有帮助,但如果您使用Spring应用程序上下文XML来设置会话工厂,那么设置log4j SQL级别变量只会让您获得部分方式,您还必须设置hibernate应用程序上下文中的.show_sql变量本身可以让Hibernate开始实际显示值。
ApplicationContext.xml具有:
<property name="hibernateProperties">
<value>
hibernate.jdbc.batch_size=25
... <!-- Other parameter values here -->
hibernate.show_sql=true
</value>
</property>
你的log4j文件需要
log4j.logger.org.hibernate.SQL=DEBUG
答案 21 :(得分:1)
记录工作但不是你想要的或者我想要的,但是P6Spy确实有效完美,
这里也是一个简单的教程MKYONG tutorial for P6Spy。
对我而言,它就像魅力一样。
提取p6spy-install.jar
文件,查找p6spy.jar
和spy.properties
将p6spy.jar
添加到项目库依赖项
修改数据库配置文件。您需要用P6Spy JDBC驱动程序替换现有的JDBC驱动程序 - com.p6spy.engine.spy.P6SpyDriver
原创是MySQL JDBC驱动程序 - 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驱动程序 - 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
将real driver
替换为现有的MySQL JDBC驱动程序
realdriver=com.mysql.jdbc.Driver
#specifies another driver to use
realdriver2=
#specifies a third driver to use
realdriver3=
更改日志文件位置 更改logfile属性中的日志文件位置,所有SQL语句都将登录到此文件中。
窗
logfile = c:/spy.log
* nix中
logfile = /srv/log/spy.log
“spy.properties”
复制到项目类路径 将“spy.properties”
复制到项目根文件夹,确保您的项目可以找到“spy.properties”,否则会提示“spy.properties”
找不到文件异常。
答案 22 :(得分:1)
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/
答案 23 :(得分:1)
使用Wireshark或类似的东西:
上述答案都不会正确打印带有参数的sql,或者是一种痛苦。我通过使用WireShark实现了这一点,它使用查询捕获从应用程序发送到Oracle / Mysql等的所有sql /命令。
答案 24 :(得分:0)
在Java中:
如果它是CriteriaQuery(javax.persistence),则在TypedQuery中转换您的查询。
然后:
query.unwrap(org.hibernate.Query.class).getQueryString();
答案 25 :(得分:0)
Hibernate在不同的行中显示查询及其参数值。
如果您在spring boot中使用application.properties,则可以在application.properties中使用以下突出显示的参数。
org.hibernate.SQL将显示查询
org.hibernate.type将显示所有参数值,这些参数值将使用select,insert和update查询进行映射。 logging.level.org.hibernate.type = TRACE
org.hibernate.type.EnumType将显示枚举类型参数值
example ::
2018-06-14 11:06:28,217 TRACE [main] [EnumType.java : 321] Binding [active] to parameter: [1]
sql.BasicBinder将显示整数,varchar,布尔类型参数值
example ::
答案 26 :(得分:0)
对我来说最简单的解决方案是实现一个常规的stringReplace来用参数值替换参数输入(为简单起见,将所有参数都视为字符串):
String debugedSql = sql;
//then, for each named parameter
debugedSql = debugedSql.replaceAll(":"+key, "'"+value.toString()+"'");
//and finnaly
println(debugedSql);
或类似的位置参数(?) 如果要记录运行就绪的sql,请注意空值和特定值类型,如date。
答案 27 :(得分:0)
要使用Wildfly(standalone.xml)进行开发,请添加这些记录器:
<logger category="org.hibernate.SQL">
<level name="DEBUG"/>
</logger>
<logger category="org.hibernate.type.descriptor.sql">
<level name="TRACE"/>
</logger>
答案 28 :(得分:0)
hibernate-types具有实用程序方法来记录jpql和条件查询。 可以在汽车制造商的blog post中找到更多详细信息。这是使用jpql的示例:
Query jpql = entityManager.createQuery("""
select
YEAR(p.createdOn) as year,
count(p) as postCount
from
Post p
group by
YEAR(p.createdOn)
""", Tuple.class
);
String sql = SQLExtractor.from(jpql);
sql
变量具有以下值:
SELECT
extract(YEAR FROM sqlextract0_.created_on) AS col_0_0_,
count(sqlextract0_.id) AS col_1_0_
FROM
post p
GROUP BY
extract(YEAR FROM p.created_on)
它可以原样复制粘贴到db控制台中。
答案 29 :(得分:0)
它对我有用
logging.level.org.hibernate.SQL =调试
logging.level.org.hibernate.type = TRACE
答案 30 :(得分:0)
使用 yaml 属性
logging.level.org.hibernate:
SQL: DEBUG
type.descriptor.sql.BasicBinder: TRACE
答案 31 :(得分:0)
我对这里的所有答案都遇到了问题,实际上没有一个为我提供了作为 PK 传递的枚举的 Spring Data JPA 查询的参数。
休眠 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>
将 hibernate.format_sql
设置为 true
以获得漂亮的打印效果,这是我的输出示例
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)
我尝试简单地将 org.hibernate.engine.spi.QueryParameters
设置为 trace
,但由于某种原因,命名参数一直处于静音状态,因此我将其他所有正在记录的内容静音。它似乎没有记录所有参数,所以我仍然需要 BasicBinding
日志。
答案 32 :(得分:-2)
如果您使用的是Spring Boot和JPA
spring.jpa.properties.hibernate.show_sql=false
告诉休眠状态以隐藏日志
true似乎是默认设置!