Hibernate show real SQL [duplicate]
Asked Answered
R

5

440

if I set

<property name="show_sql">true</property>

in my hibernate.cfg.xml configuration file in the console I can see the SQL.

But it's not real SQL... Can I see the SQL code that will be passed directly to database?

Example:

I see

select this_.code from true.employee this_ where this_.code=?

Can I see

select employee.code from employee where employee.code=12

the real SQL?

Retroact answered 29/3, 2010 at 9:17 Comment(6)
Hibernate uses prepared statements internally, so it doesn't ever have the SQL in a format where they values would be embeddedGardal
Does it really say true.employee?Protege
the only working solution I have found is here : mkyong.com/hibernate/…Exodontist
Contrary to what is written here, I have not found an answer to this question there : Print query string in hibernate with parameter values.Cargo
@Gardal — Surely Hibernate has the real SQL queries at some point. The real queries are generated, before being sent to the database.Cargo
@NicolasBarbulesco The version with the question marks is the real SQL. All JDBC drivers can accept queries in this format. Under the hood, the JDBC driver may reformat the query to match the DB's native placeholder format (e.g, Oracle and PostgreSQL will replace ? with :1, :2, etc), and in some specific cases it may replace the bind placeholders with escaped values (some MySQL drivers do this). However, most DBs are capable of handling queries with placeholders natively.Nance
R
283

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 --> %d{HH: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

Some frameworks use persistence.xml:

<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.use_sql_comments" value="true"/>
Retroact answered 29/3, 2010 at 15:5 Comment(8)
is there a way we can get information about bind parameters in the logs?Shoa
@Rachel, what more than logging such as TRACE [BasicBinder] binding parameter [1] as [VARCHAR] - john doe do you need?Whitening
dont work on hibernate 4.3!!Weld
If you add org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl you can deduce the bound values from the Releasing statement- or Closing prepared statement-lines (at least with H2)Affable
@Whitening Having the params listed separately really isn't very helpful. Part of why I'd want sql prints like this is so I can run the statements myself and see what's going on. Having to pluck through and insert params by hand is just clumsy. Shame there isn't a more streamlined way to have these printed.Sashenka
What if I don't have log4j in my project?Footstool
What does it look like in the logs after this??? No visual???Pathetic
@Whitening how about for it to ACTUALLY show the bound parameters IN THE SAME LINE AS "INSERT"??????Pathetic
P
411

Can I see (...) the real SQL

If you want to see the SQL sent directly to the database (that is formatted similar to your example), you'll have to use some kind of jdbc driver proxy like P6Spy (or log4jdbc).

Alternatively you can enable logging of the following categories (using a log4j.properties file here):

log4j.logger.org.hibernate.SQL=DEBUG
log4j.logger.org.hibernate.type=TRACE

The first is equivalent to hibernate.show_sql=true, the second prints the bound parameters among other things.

Reference

Proceeding answered 29/3, 2010 at 9:20 Comment(11)
I like P6Spy, especially when running unit tests, because it'll also give you the result set of your query in addition to the bind parameter values.Haymes
can you post the log output example?Ditzel
@Pascal I don't think you should say "If you want to see it formatted exactly as in your example" because it it depends highly on what database he is using and if hibernate chooses to batch/prepare the statement.Fredericksburg
Enabling the org.hibernate.type category didn't work for me, but enabling the org.hibernate.loader.hql category instead did work.Demicanton
You may need to tell Hibernate what logging manager you use (log4j, slf4j), see how.Immensurable
For Eclipse Mars the file is "hibernate-log4j.properties"Economist
P6Spy has a bit of an annoying log format that can't be changed easily: #17789723Zymogenesis
In my case I use logback and want to do it programatically on IDE debug, so I did thisFluidextract
One can use -Dhibernate.show_sql=true with Java process to enable sql output in Hibernate.Greenheart
When I use this configurations the result of each query is also printed on console. Is there a way to print only the query? Sometimes the results take so much time to print.Uncompromising
Can you show the output of what it looks like in the log files? people answering this question have been scared to show what it actually looks like in the log.Pathetic
R
283

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 --> %d{HH: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

Some frameworks use persistence.xml:

<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.use_sql_comments" value="true"/>
Retroact answered 29/3, 2010 at 15:5 Comment(8)
is there a way we can get information about bind parameters in the logs?Shoa
@Rachel, what more than logging such as TRACE [BasicBinder] binding parameter [1] as [VARCHAR] - john doe do you need?Whitening
dont work on hibernate 4.3!!Weld
If you add org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl you can deduce the bound values from the Releasing statement- or Closing prepared statement-lines (at least with H2)Affable
@Whitening Having the params listed separately really isn't very helpful. Part of why I'd want sql prints like this is so I can run the statements myself and see what's going on. Having to pluck through and insert params by hand is just clumsy. Shame there isn't a more streamlined way to have these printed.Sashenka
What if I don't have log4j in my project?Footstool
What does it look like in the logs after this??? No visual???Pathetic
@Whitening how about for it to ACTUALLY show the bound parameters IN THE SAME LINE AS "INSERT"??????Pathetic
C
19

If you can already see the SQL being printed, that means you have the code below in your hibernate.cfg.xml:

<property name="show_sql">true</property>

To print the bind parameters as well, add the following to your log4j.properties file:

log4j.logger.net.sf.hibernate.type=debug
Clapboard answered 29/3, 2010 at 12:51 Comment(2)
this applies only to hibernate version < 3.0 right?Navarrete
@Brian - do I need to put in <Loggers></Loggers> and appenderRef ?Braziel
L
11

Worth noting that the code you see is sent to the database as is, the queries are sent separately to prevent SQL injection. AFAIK The ? marks are placeholders that are replaced by the number params by the database, not by hibernate.

Liturgy answered 6/4, 2010 at 21:11 Comment(0)
P
2

select this_.code from true.employee this_ where this_.code=? is what will be sent to your database.

this_ is an alias for that instance of the employee table.

Protege answered 29/3, 2010 at 9:49 Comment(1)
The problem is not the This but the ?Deyoung

© 2022 - 2024 — McMap. All rights reserved.