Hibernate显示真实的SQL [重复]
Posted
技术标签:
【中文标题】Hibernate显示真实的SQL [重复]【英文标题】:Hibernate show real SQL [duplicate] 【发布时间】:2011-02-01 23:17:16 【问题描述】:如果我设置
<property name="show_sql">true</property>
在控制台的hibernate.cfg.xml配置文件中,我可以看到SQL。
但这不是真正的 SQL...我可以看到将直接传递给数据库的 SQL 代码吗?
例子:
我明白了
select this_.code from true.employee this_ where this_.code=?
我可以看看
select employee.code from employee where employee.code=12
真正的 SQL?
【问题讨论】:
Hibernate 在内部使用准备好的语句,因此它永远不会以将嵌入它们的值的格式提供 SQL 真的是true.employee
吗?
我找到的唯一可行的解决方案是:mkyong.com/hibernate/…
与这里写的相反,我还没有找到这个问题的答案:Print query string in hibernate with parameter values。
@NicolasBarbulesco 带问号的版本是真正的 SQL。所有 JDBC 驱动程序都可以接受这种格式的查询。在底层,JDBC 驱动程序可能会重新格式化查询以匹配数据库的原生占位符格式(例如,Oracle 和 PostgreSQL 将用 :1
、:2
等替换 ?
),并且在某些特定情况下,它可能会替换使用转义值绑定占位符(一些 mysql 驱动程序这样做)。但是,大多数数据库都能够原生处理带有占位符的查询。
【参考方案1】:
我可以看到(...)真正的 SQL
如果您想查看直接发送到数据库的 SQL(格式与您的示例相似),您必须使用某种 jdbc 驱动程序代理,例如 P6Spy(或log4jdbc)。
或者,您可以启用以下类别的日志记录(在此处使用 log4j.properties
文件):
log4j.logger.org.hibernate.SQL=DEBUG
log4j.logger.org.hibernate.type=TRACE
第一个等效于hibernate.show_sql=true
,第二个打印绑定的参数等。
参考
Hibernate 3.5 核心文档 3.5. Logging Hibernate 4.1 核心文档 4.1. Logging【讨论】:
我喜欢 P6Spy,尤其是在运行单元测试时,因为除了绑定参数值之外,它还会为您提供查询的结果集。 可以贴一下日志输出的例子吗? @Pascal 我认为你不应该说 “如果你想看到它的格式 完全 就像你的例子一样” 因为它取决于高度关注他正在使用的数据库以及hibernate是否选择批处理/准备语句。 启用org.hibernate.type
类别对我不起作用,但启用org.hibernate.loader.hql
类别确实有效。
您可能需要告诉 Hibernate 您使用的日志管理器(log4j、slf4j),请参阅how。【参考方案2】:
select this_.code from true.employee this_ where this_.code=?
是将发送到您的数据库的内容。
this_
是 employee
表的该实例的别名。
【讨论】:
问题不是这个,而是那个?【参考方案3】:如果您已经可以看到正在打印的 SQL,则表示您的 hibernate.cfg.xml 中有以下代码:
<property name="show_sql">true</property>
要同时打印绑定参数,请将以下内容添加到您的 log4j.properties 文件中:
log4j.logger.net.sf.hibernate.type=debug
【讨论】:
这仅适用于休眠版本 @Brian - 我需要放入log4j.properties
log4j.logger.org.hibernate=INFO, hb
log4j.logger.org.hibernate.SQL=DEBUG
log4j.logger.org.hibernate.type=TRACE
log4j.logger.org.hibernate.hql.ast.AST=info
log4j.logger.org.hibernate.tool.hbm2ddl=warn
log4j.logger.org.hibernate.hql=debug
log4j.logger.org.hibernate.cache=info
log4j.logger.org.hibernate.jdbc=debug
log4j.appender.hb=org.apache.log4j.ConsoleAppender
log4j.appender.hb.layout=org.apache.log4j.PatternLayout
log4j.appender.hb.layout.ConversionPattern=HibernateLog --> %dHH:mm:ss %-5p %c - %m%n
log4j.appender.hb.Threshold=TRACE
hibernate.cfg.xml
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="use_sql_comments">true</property>
persistence.xml
一些框架使用persistence.xml
:
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.use_sql_comments" value="true"/>
【讨论】:
有没有办法在日志中获取绑定参数的信息? @Rachel,除了TRACE [BasicBinder] binding parameter [1] as [VARCHAR] - john doe
之类的日志记录之外,您还需要什么?
不要在休眠 4.3 上工作!!
如果添加org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl
,您可以从Releasing statement
- 或Closing prepared statement
-行中推断出绑定值(至少使用H2)
@Arjan 单独列出参数确实不是很有帮助。我想要这样的 sql 打印的部分原因是我可以自己运行这些语句,看看发生了什么。不得不手动拔出并插入参数只是笨拙的。遗憾的是没有更简化的方式来打印这些内容。【参考方案5】:
值得注意的是,您看到的代码是按原样发送到数据库的,查询是单独发送的,以防止 SQL 注入。阿法伊克?标记是占位符,由数据库而不是休眠替换为数字参数。
【讨论】:
以上是关于Hibernate显示真实的SQL [重复]的主要内容,如果未能解决你的问题,请参考以下文章
Java 11:OSGi:生成 EntityManager,无法构建 Hibernate SessionFactory java.lang.ClassNotFoundException:org.hib
hibernate使用setResultTransformer()将SQL查询结果放入集合中