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 - 我需要放入 和 appenderRef 吗?【参考方案4】:

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查询结果放入集合中

Hibernate参考文档

一 Mybatis概述&与Hibernate的区别&CRUD

hibernate入门知识-01

hibernate读取内存的问题