Могу ли я получить строку SQL из объекта запроса JPA?

Могу ли я узнать, как получить sql из запроса JPA? или, скажем, преобразовать запрос JPA в строку SQL? Большое вам спасибо!

Ответ 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 по мере их выполнения