如何查看 Hibernate 生成的 SQL

x33g5p2x  于2022-09-14 转载在 Java  
字(3.1k)|赞(0)|评价(0)|浏览(513)

为了显示 Hibernate 在后台生成的 SQL,您需要在配置文件中启用一个属性。

如果您使用 JPA 开发应用程序,您只需在 persistence.xml 文件中将属性 hibernate.show_sql 设置为 true。看这个例子:

<persistence version="2.1"
   xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="
        http://xmlns.jcp.org/xml/ns/persistence
        http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
   <persistence-unit name="primary">
      <jta-data-source>java:jboss/datasources/KitchensinkQuickstartDS</jta-data-source>
      <properties>
         <!-- Properties for Hibernate -->
         <property name="hibernate.hbm2ddl.auto" value="create-drop" />
         <property name="hibernate.show_sql" value="true" />
      </properties>
   </persistence-unit>
</persistence>

因此,在您的服务器日志中,您将看到 Hibernate 在后台执行的所有 SQL 语句:

为了查看您的语句的绑定参数,您可以激活以下记录器类别:

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

这是具有上述 Logger 的应用程序的输出:

2022-09-10 17:29:55,502 INFO  [stdout] (default task-1) Hibernate: select member0_.id as id1_0_, member0_.email as email2_0_, member0_.name as name3_0_, member0_.phone_number as phone_nu4_0_ from MemberJSP member0_ order by member0_.name asc
2022-09-10 17:29:55,510 TRACE [org.hibernate.type.descriptor.sql.BasicExtractor] (default task-1) extracted value ([id1_0_] : [BIGINT]) - [0]
2022-09-10 17:29:55,513 TRACE [org.hibernate.type.descriptor.sql.BasicExtractor] (default task-1) extracted value ([email2_0_] : [VARCHAR]) - [john.smith@mailinator.jsp.com]
2022-09-10 17:29:55,514 TRACE [org.hibernate.type.descriptor.sql.BasicExtractor] (default task-1) extracted value ([name3_0_] : [VARCHAR]) - [John Smith]
2022-09-10 17:29:55,514 TRACE [org.hibernate.type.descriptor.sql.BasicExtractor] (default task-1) extracted value ([phone_nu4_0_] : [VARCHAR]) - [2125551212]

最后,要在数据源级别配置 SQL 语句的绑定,请查看这篇文章:如何使用 JBoss 和 WildFly 跟踪 JDBC 语句

格式化 SQL

实际上,您可以在控制台上看到的输出可能非常混乱。您可以通过添加以下属性来打开 SQL 格式化:

<property name="hibernate.format_sql" value="true" />

结果,您将在日志中看到格式良好的输出:

17:37:03,994 INFO  [stdout]  Hibernate: 
17:37:03,994 INFO  [stdout]      
17:37:03,994 INFO  [stdout]      drop table Member if exists
17:37:03,994 INFO  [stdout]  Hibernate: 
17:37:03,994 INFO  [stdout]      
17:37:03,994 INFO  [stdout]      drop sequence if exists hibernate_sequence
17:37:03,995 INFO  [stdout]  Hibernate: create sequence hibernate_sequence start with 1 increment by 1
17:37:03,995 INFO  [stdout]  Hibernate: 
17:37:03,995 INFO  [stdout]      
17:37:03,995 INFO  [stdout]      create table Member (
17:37:03,995 INFO  [stdout]         id bigint not null,
17:37:03,995 INFO  [stdout]          email varchar(255) not null,
17:37:03,995 INFO  [stdout]          name varchar(25) not null,
17:37:03,995 INFO  [stdout]          phone_number varchar(12) not null,
17:37:03,995 INFO  [stdout]          primary key (id)
17:37:03,995 INFO  [stdout]      )

使用本机 Hibernate 配置

另一方面,如果您正在使用本机 Hibernate 开发应用程序,则需要在您的 hibernate.cfg.xml 文件中放置以下属性:

<hibernate-configuration>
    <session-factory>
         <!-- connection settings -->
        <property name="show_sql">true</property>
        <property name="format_sql">true</property>
    </session-factory>
</hibernate-configuration>

对于 JPA 示例,属性 show_sql 当设置为 true 时将打印 SQL 语句。属性 format_sql 当设置为 true 时将格式化 SQL 语句。

相关文章

微信公众号

最新文章

更多