Как напечатать строку запроса со значениями параметров при использовании Hibernate - PullRequest
339 голосов
/ 10 ноября 2009

Возможно ли в Hibernate печатать сгенерированные запросы SQL с реальными значениями вместо вопросительных знаков?

Как бы вы предложили печатать запросы с реальными значениями, если это невозможно с Hibernate API?

Ответы [ 29 ]

1 голос
/ 10 октября 2013

Используйте Wireshark или что-то подобное:

Ни один из вышеупомянутых ответов не напечатает sql с параметрами должным образом, или это боль. Я добился этого с помощью WireShark , который захватывает все sql / команды, отправляемые из приложения в Oracle / Mysql и т. Д. С запросами.

1 голос
/ 09 октября 2015

Ведение журнала работает, но не совсем так, как вы хотели или я хотел некоторое время назад, но P6Spy действительно работает отлично ,

Вот простой учебник для реализации Учебник MKYONG для P6Spy .

для меня это сработало как шарм.

  1. Загрузить библиотеку P6Spy

Получите «p6spy-install.jar»

  1. Извлеките его

Извлеките файл p6spy-install.jar, найдите p6spy.jar и spy.properties

  1. Добавить библиотечную зависимость

Добавьте p6spy.jar в вашу библиотеку проектов

  1. Изменить файл свойств P6Spy

Измените файл конфигурации базы данных. Вам необходимо заменить существующий драйвер JDBC на драйвер JDBC P6Spy - com.p6spy.engine.spy.P6SpyDriver

Оригинал - драйвер JDBC MySQL - com.mysql.jdbc.Driver

<session-factory>
  <property name="hibernate.bytecode.use_reflection_optimizer">false</property>
  <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
  <property name="hibernate.connection.password">password</property>
  <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mkyong</property>
  <property name="hibernate.connection.username">root</property>
  <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
  <property name="show_sql">true</property>
</session-factory>

Изменил его на драйвер JDBC P6Spy - com.p6spy.engine.spy.P6SpyDriver

<session-factory>
  <property name="hibernate.bytecode.use_reflection_optimizer">false</property>
  <property name="hibernate.connection.driver_class">com.p6spy.engine.spy.P6SpyDriver
  </property>
  <property name="hibernate.connection.password">password</property>
  <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mkyong</property>
  <property name="hibernate.connection.username">root</property>
  <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
  <property name="show_sql">true</property>
</session-factory>
  1. Изменить файл свойств P6Spy Изменить файл свойств P6Spy - spy.properties

Замените real driver существующим драйвером MySQL JDBC

realdriver=com.mysql.jdbc.Driver

#specifies another driver to use
realdriver2=
#specifies a third driver to use
realdriver3=

Изменить местоположение файла журнала Измените расположение файла журнала в свойстве logfile, все операторы SQL будут входить в этот файл.

Windows

logfile     = c:/spy.log

* Никс

logfile     = /srv/log/spy.log
  1. Скопировать “spy.properties” в путь к классам проекта

Скопируйте “spy.properties” в корневую папку вашего проекта, убедитесь, что ваш проект может найти «spy.properties», иначе он выдаст “spy.properties” файл не найден, исключение.

1 голос
/ 29 мая 2018

В Java:

Преобразуйте ваш запрос в TypedQuery, если это CriteriaQuery (javax.persistence).

Тогда:

query.unwrap (org.hibernate.Query.class) .getQueryString ();

1 голос
/ 03 августа 2016

Все ответы здесь полезны, но если вы используете XML-контекст приложения Spring для настройки фабрики сеансов, установка переменной уровня SQL log4j только помогает вам в этом, вы также должны установить спящий режим Переменная .show_sql в самом контексте приложения, чтобы Hibernate начал отображать значения.

ApplicationContext.xml имеет:

<property name="hibernateProperties">
            <value>
            hibernate.jdbc.batch_size=25
            ... <!-- Other parameter values here -->
            hibernate.show_sql=true
            </value>
 </property>

А вашему файлу log4j нужно

log4j.logger.org.hibernate.SQL=DEBUG
1 голос
/ 31 октября 2013

Вы можете войти это:

net.sf.hibernate.hql.QueryTranslator

Пример вывода:

2013-10-31 14:56:19,029 DEBUG [net.sf.hibernate.hql.QueryTranslator] HQL: select noti.id, noti.idmicrosite, noti.fcaducidad, noti.fpublicacion, noti.tipo, noti.imagen, noti.visible, trad.titulo, trad.subtitulo, trad.laurl, trad.urlnom, trad.fuente, trad.texto  from org.ibit.rol.sac.micromodel.Noticia noti join noti.traducciones trad where index(trad)='ca' and noti.visible='S' and noti.idmicrosite=985 and noti.tipo=3446

2013-10-31 14:56:19,029 DEBUG [net.sf.hibernate.hql.QueryTranslator] SQL: select noticia0_.NOT_CODI as x0_0_, noticia0_.NOT_MICCOD as x1_0_, noticia0_.NOT_CADUCA as x2_0_, noticia0_.NOT_PUBLIC as x3_0_, noticia0_.NOT_TIPO as x4_0_, noticia0_.NOT_IMAGEN as x5_0_, noticia0_.NOT_VISIB as x6_0_, traduccion1_.NID_TITULO as x7_0_, traduccion1_.NID_SUBTIT as x8_0_, traduccion1_.NID_URL as x9_0_, traduccion1_.NID_URLNOM as x10_0_, traduccion1_.NID_FUENTE as x11_0_, traduccion1_.NID_TEXTO as x12_0_ from GUS_NOTICS noticia0_ inner join GUS_NOTIDI traduccion1_ on noticia0_.NOT_CODI=traduccion1_.NID_NOTCOD where (traduccion1_.NID_CODIDI='ca' )and(noticia0_.NOT_VISIB='S' )and(noticia0_.NOT_MICCOD=985 )and(noticia0_.NOT_TIPO=3446 )
0 голосов
/ 30 апреля 2019

для разработки с Wildfly (standalone.xml), добавьте эти логгеры:

<logger category="org.hibernate.SQL">
   <level name="DEBUG"/>
</logger>
<logger category="org.hibernate.type.descriptor.sql">
   <level name="TRACE"/>
</logger>
0 голосов
/ 16 июня 2018

Самым простым решением для меня является реализация обычного stringReplace для замены входных параметров на значения параметров (для простоты трактуя все параметры как строку):

 String debugedSql = sql;
 //then, for each named parameter
     debugedSql = debugedSql.replaceAll(":"+key, "'"+value.toString()+"'");
 //and finnaly
 println(debugedSql);

или что-то подобное для позиционных параметров (?).
Позаботьтесь о пустых значениях и конкретных типах значений, таких как дата, если вы хотите, чтобы в журнал был записан готовый запуск sql.

0 голосов
/ 19 октября 2018

Если вы используете весеннюю загрузку и jpa

spring.jpa.properties.hibernate.show_sql=false

говорит спящему спрятать логи

true, кажется, по умолчанию !!

0 голосов
/ 14 июня 2018

Hibernate показывает запрос и значения его параметров в разных строках.

Если вы используете application.properties при весенней загрузке и можете использовать нижеуказанный параметр в application.properties.

  1. org.hibernate.SQL будет показывать запросы

    logging.level.org.hibernate.SQL = DEBUG

  2. org.hibernate.type покажет все значения параметров, которые будут сопоставлены с запросами выбора, вставки и обновления. logging.level.org.hibernate.type = TRACE

    • org.hibernate.type.EnumType покажет значение параметра типа enum

      logging.level.org.hibernate.type.EnumType = TRACE

      пример ::

      2018-06-14 11:06:28,217 TRACE [main] [EnumType.java : 321] Binding [active] to parameter: [1]
      
    • sql. BasicBinder покажет целое, varchar, значение параметра логического типа

      logging.level.org.hibernate.type.descriptor.sql.BasicBinder = TRACE

      пример ::

      • 2018-06-14 11: 28: 29,750 TRACE [http-nio-9891-exec-2] [BasicBinder.java: 65] параметр привязки [1] как [BOOLEAN] - [true]
      • 2018-06-14 11: 28: 29,751 TRACE [http-nio-9891-exec-2] [BasicBinder.java: 65] параметр привязки [2] как [INTEGER] - [1]
      • 2018-06-14 11: 28: 29,752 Параметр привязки TRACE [http-nio-9891-exec-2] [BasicBinder.java: 65] [3] как [VARCHAR] - [открытый]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...