Можно ли вывести сгенерированный SQL с помощью EclipseLink, не увеличивая детализацию журнала? - PullRequest
33 голосов
/ 03 марта 2010

Я хочу вывести SQL, сгенерированный EclipseLink, на консоль во время разработки. Тем не менее, я мог сделать это только с помощью уровня ведения журнала FINE. У меня сложная модель предметной области, состоящая из многих классов, настолько, что развертывание занимает значительное время, когда подробность журнала находится на уровне FINE, поскольку EclipseLink выводит свой анализ всей модели.

Есть ли способ получить SQL, не прибегая к логическому уровню FINE (как это делает Hibernate)?

Ответы [ 3 ]

58 голосов
/ 05 сентября 2011

Добавьте следующие свойства в ваш persistence.xml:

 <property name="eclipselink.logging.level.sql" value="FINE"/>
 <property name="eclipselink.logging.parameters" value="true"/>

Последнее полезно для отображения значений параметра.

В качестве альтернативы используется log4jdbc или log4jdbc-remix .

22 голосов
/ 03 марта 2010

Создание журнала для EclipseLink кажется довольно сложным, в соответствии с этой веткой .

В нем упоминается persistence.xml файл с уровнем журнала, который вы можете адаптировать:

<property name="eclipselink.weaving" value="static" />
<property name="eclipselink.logging.level.sql" value="FINEST" />
<property name="eclipselink.logging.level" value="FINEST" />
<property name="eclipselink.logging.level.cache" value="FINEST" />

Но могут потребоваться некоторые другие настройки.

Как Мартин документы ниже , " EclipseLink / examples / JPA / Logging " документирует эти свойства.

10 голосов
/ 24 августа 2012

Чтобы получить SQL для конкретного запроса во время выполнения, вы можете использовать API DatabaseQuery.

Query query = em.createNamedQuery("findMe"); 
Session session = em.unwrap(JpaEntityManager.class).getActiveSession(); 
DatabaseQuery databaseQuery = ((EJBQueryImpl)query).getDatabaseQuery(); 
databaseQuery.prepareCall(session, new DatabaseRecord());

String sqlString = databaseQuery.getSQLString();

Этот SQL будет содержать? для параметров. Для перевода SQL с аргументами вам необходим DatabaseRecord со значениями параметров.

DatabaseRecord recordWithValues= new DatabaseRecord();
recordWithValues.add(new DatabaseField("param1"), "someValue");

String sqlStringWithArgs = 
         databaseQuery.getTranslatedSQLString(session, recordWithValues);

Источник: Как получить SQL для запроса

...