I need to get the string from an Hibernate query and process it later (so I can\'t solve it with \"hibernate.show_sql\"
).
I have already looked at How t
There is no such thing as "the full SQL string with the parameters values".
Hibernate uses prepared statements, therefore it sends query string with ?
s and parameter values to the database separately, so that the actual query is never constructed.
Perhaps you can find a way extract parameter values from QueryImpl
, but even in this case you won't be able to get a query ready for execution, because you'll need to handle escaping, conversion of parameter values to SQL literals, etc.
JdbcLogger does this form you. http://jdbclogger.sourceforge.net/. Supports mysql, postgres, and spring integration.
You have to set TRACE
level of logging to this hibernate package and parameter binding should show in your application log:
<category name="org.hibernate.type">
<priority value="TRACE"/>
</category>
Output example:
13:58:51,505 DEBUG [SQL]
insert
into
s.audit
(action, e_s, ip, time, userid, id)
values
(?, ?, ?, ?, ?, ?)
13:58:51,505 TRACE [StringType] binding 'Modify user' to parameter: 1
13:58:51,505 TRACE [StringType] binding 'E' to parameter: 2
13:58:51,505 TRACE [StringType] binding '164.20.81.65' to parameter: 3
13:58:51,505 TRACE [TimestampType] binding '2012-07-30 13:58:51' to parameter: 4
13:58:51,505 TRACE [IntegerType] binding '158' to parameter: 5
13:58:51,505 TRACE [IntegerType] binding '8851' to parameter: 6
And don't forget 'hibernate.show_sql=true'
property you said previously to show also the related SQL.
There is a tool called p6spy. It's a bit older and I am afraid it isn't maintained anymore. It gave me good results in the past, anyway.
Edit: just found that it is being actively developed again. Works like a charm for me!
Another option is to use datasource-proxy which allows to listen to different JDBC events including query execution.
You can implement QueryExecutionListener.beforeQuery that receives QueryInfo
with SQL query text and all parameters.