Могу ли я узнать, как получить sql из запроса JPA? или, скажем, преобразовать запрос JPA в строку SQL? Большое вам спасибо!
Могу ли я получить строку SQL из объекта запроса JPA?
Ответ 1
Если вы хотите узнать, как ваш перевод JPQL или Query Query переводится на диалект SQL вашей базы данных, вы можете включить мелкозернизованное ведение журнала в xml persistence, а затем просмотреть ваши файлы журналов.
Имя и значение свойства зависят от вашей реализации JPA. Ниже приведен пример соответствующей части persistence.xml для EclipseLink:
<properties>
<property name="eclipselink.logging.level" value="FINEST"/>
</properties>
Ответ 2
Для Eclipselink: вы можете извлечь SQL следующим образом:
query.unwrap(EJBQueryImpl.class).getDatabaseQuery().getSQLString()
Он работает только после, запрос выполнен.
Ответ 3
Помимо включения ведения журнала, например, @Matt Handy, также можно получить SQL String для конкретного запроса с eclipselink во время выполнения, как описано здесь.
Ответ 4
Вам, вероятно, интересно, есть ли способ "извлечь" строку JPQL (либо с заполнителями для параметров, либо с окончательным JPQL после заполнения параметров) из javax.persistence.Query(один из возможных подклассов будет больше точный), в этом случае это невозможно в соответствии с контрактом спецификации JPA. Однако это гипотетически может быть реализовано с помощью JPA-реализации (например, NamedQueryImpl может иметь #toJPQLString(), к которому вы можете получить доступ посредством кастинга), но я сомневаюсь в этом. И даже если это возможно, я не думаю, что это хороший код, выполняющий такие манипуляции. Я бы предложил найти другие дизайнерские решения (и для этого вы могли бы указать, какая у вас проблема). Например, если вы строите свои запросы динамически, для этого может использоваться API-интерфейс JPA, и наряду с запросом "создания" JPA вы можете сохранить свою внутреннюю структуру данных, отражающую логику вашего запроса.
Ответ 5
После ответа Кароля - можно получить SQL перед выполнением инструкции в EclipseLink:
Session session = em.unwrap(JpaEntityManager.class).getActiveSession();
DatabaseQuery databaseQuery = query.unwrap(EJBQueryImpl.class).getDatabaseQuery();
databaseQuery.prepareCall(session, new DatabaseRecord());
Record r = databaseQuery.getTranslationRow();
String bound = databaseQuery.getTranslatedSQLString(session, r);
String sqlString = databaseQuery.getSQLString();
Чтобы извлечь строку SQL во время/после выполнения, вероятно, лучше всего сделать это с использованием свойств persistence, а не in-code:
<property name="eclipselink.logging.parameters" value="true"/>
<property name="eclipselink.logging.level" value="FINE"/>
Ответ 6
С помощью Hibernate в качестве поставщика вы можете включить следующие свойства:
hibernate.show_sql
Записать все инструкции SQL в консоль. Это альтернатива настройке категории журнала org.hibernate.SQL для отладки. (например, true | false)
hibernate.format_sql
Достаточно распечатать SQL в журнале и консоли. (например, true | false)
Или, как указано выше, вы можете включить ведение журнала на уровне отладки для журнала
org.hibernate.SQL
Регистрировать все операторы SQL DML по мере их выполнения
Ответ 7
Этот блог содержит инструкции: http://narcanti.keyboardsamurais.de/hibernate-hql-to-sql-translation.html