Hibernate показать реальный SQL
если я установил
<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?
Ответы
Ответ 1
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
В некоторых фреймворках используется persistence.xml
:
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.use_sql_comments" value="true"/>
Ответ 2
Можно ли увидеть (...) реальный 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 Основная документация
- Hibernate 4.1 Основная документация
Ответ 3
Если вы уже видите, что SQL печатается, значит, у вас есть код ниже в вашем hibernate.cfg.xml:
<property name="show_sql">true</property>
Чтобы распечатать параметры привязки, добавьте в файл log4j.properties следующее:
log4j.logger.net.sf.hibernate.type=debug
Ответ 4
Стоит отметить, что код, который вы видите, отправляется в базу данных как есть, запросы отправляются отдельно, чтобы предотвратить SQL-инъекцию. AFAIK? метки - это заполнители, которые вместо базы данных заменяются номерами параметров, а не спящим.
Ответ 5
select this_.code from true.employee this_ where this_.code=?
, который будет отправлен в вашу базу данных.
this_
является псевдонимом для этого экземпляра таблицы employee
.