Могу ли я получить строку SQL из объекта запроса JPA? - PullRequest
16 голосов
/ 08 июня 2011

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

Ответы [ 7 ]

11 голосов
/ 10 февраля 2016

Для Eclipselink: вы можете извлечь SQL следующим образом:

query.unwrap(EJBQueryImpl.class).getDatabaseQuery().getSQLString()

Работает только после запроса был выполнен.

7 голосов
/ 08 июня 2011

Если вы хотите знать только, как ваш JPQL или Criteria Query переводится на диалект SQL вашей базы данных, вы можете включить мелкозернистое ведение журнала в persistence xml , а затем заглянуть в свои файлы журналов.

Имя и значение свойства зависят от вашей реализации JPA.Вот пример соответствующей части persistence.xml для EclipseLink:

<properties>
    <property name="eclipselink.logging.level" value="FINEST"/>
</properties>
3 голосов
/ 08 июня 2011

Помимо включения ведения журнала, как упомянуто @Matt Handy, также возможно получить строку SQL для конкретного запроса с eclipselink во время выполнения, как описано здесь .

2 голосов
/ 12 мая 2017

После ответа Кароля - Возможно получить 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 во время / после выполнения, вероятно, лучше всего сделать это, используя свойства постоянства, а нечем в коде:

<property name="eclipselink.logging.parameters" value="true"/>
<property name="eclipselink.logging.level" value="FINE"/>
2 голосов
/ 08 июня 2011

Вас, вероятно, интересует, существует ли способ «извлечь» строку JPQL (либо с заполнителями для параметров, либо с конечным JPQL после заполнения параметров) из javax.persistence.Query (один из возможных подклассов может быть болееточный), - в этом случае это не возможно в соответствии с контрактом спецификации JPA.Тем не менее, это гипотетически может быть возможно при реализации JPA (например, NamedQueryImpl может иметь #toJPQLString (), к которому вы можете получить доступ посредством приведения), но я сомневаюсь в этом.И даже если это возможно, я не думаю, что это хороший код, выполняющий такие манипуляции.Я бы предложил найти другие дизайнерские решения (и для этого вы могли бы указать, какая у вас проблема).Например, если вы строите свои запросы динамически, для этого можно было бы использовать JPA Criteria API, и наряду с «построением» запроса JPA вы могли бы поддерживать внутреннюю структуру данных, отражающую логику вашего запроса.

1 голос
/ 08 июня 2011

Используя Hibernate в качестве поставщика, вы можете включить следующие свойства:

hibernate.show_sql  

Запишите все операторы SQL в консоль. Это альтернатива настройке категории журнала org.hibernate.SQL для отладки. (например, true | false)

hibernate.format_sql

Довольно распечатать SQL в журнале и консоли. (например, true | false)

Или, как указано выше, вы можете включить ведение журнала до уровня отладки для регистратора

org.hibernate.SQL

Журнал всех операторов SQL DML по мере их выполнения

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

Этот блог содержит инструкции: http://narcanti.keyboardsamurais.de/hibernate-hql-to-sql-translation.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...