Как просмотреть SQL-запросы, выданные JPA? - PullRequest
140 голосов
/ 06 декабря 2010

Когда мой код выполняет вызов, подобный этому:

entityManager.find(Customer.class, customerID);

Как я могу увидеть SQL-запрос для этого вызова?Предполагая, что у меня нет доступа к серверу базы данных для профилирования / мониторинга вызовов, есть ли способ регистрировать или просматривать в моей IDE соответствующие запросы SQL, выданные вызовами JPA?Я иду против SQL Server 2008 R2 с использованием драйвера jTDS.

Ответы [ 13 ]

311 голосов
/ 06 декабря 2010

Параметры ведения журнала зависят от поставщика. Вам нужно знать, какую реализацию JPA вы используете.

  • Спящий режим ( см. Здесь ):

    <property name = "hibernate.show_sql" value = "true" />
    
  • EclipseLink ( см. Здесь ):

    <property name="eclipselink.logging.level" value="FINE"/>
    
  • OpenJPA ( см. Здесь ):

    <property name="openjpa.Log" value="DefaultLevel=WARN, Runtime=INFO, Tool=INFO, SQL=TRACE"/>
    
  • DataNucleus ( см. Здесь ):

    Установите категорию журнала DataNucleus.Datastore.Native на уровень, например DEBUG.

34 голосов
/ 12 августа 2011

Кроме того, если вы используете EclipseLink и хотите вывести значения параметров SQL, вы можете добавить это свойство в свой файл persistence.xml:

<property name="eclipselink.logging.parameters" value="true"/>
15 голосов
/ 22 октября 2012

Если вы используете hibernate и logback в качестве регистратора, вы можете использовать следующее (показывает только привязки, а не результаты):

<appender
    name="STDOUT"
    class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} -
            %msg%n</pattern>
    </encoder>
    <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
        <evaluator>
            <expression>return message.toLowerCase().contains("org.hibernate.type") &amp;&amp;
                logger.startsWith("returning");</expression>
        </evaluator>
        <OnMismatch>NEUTRAL</OnMismatch>
        <OnMatch>DENY</OnMatch>
    </filter>
</appender>

org.hibernate.SQL = DEBUG печатает запрос

<logger name="org.hibernate.SQL">
    <level value="DEBUG" />
</logger>

org.hibernate.type = TRACE печатает привязки и обычно результаты, которые будут подавлены через пользовательский фильтр

<logger name="org.hibernate.type">
    <level value="TRACE" />
</logger>

Вам нужна зависимость janino (http://logback.qos.ch/manual/filters.html#JaninoEventEvaluator):

<dependency>
    <groupId>org.codehaus.janino</groupId>
    <artifactId>janino</artifactId>
    <version>2.6.1</version>
</dependency>
14 голосов
/ 24 августа 2012

В EclipseLink для получения 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 для запроса

7 голосов
/ 14 июля 2013

Чтобы просмотреть все SQL и параметры в OpenJPA, поместите эти два параметра в файл persistence.xml:

<property name="openjpa.Log" value="DefaultLevel=WARN, Runtime=INFO, Tool=INFO, SQL=TRACE"/>
<property name="openjpa.ConnectionFactoryProperties" value="PrintParameters=true" />
4 голосов
/ 12 декабря 2013

Пример использования log4j ( src \ log4j.xml ):

<?xml version="1.0" encoding="UTF-8" ?>

<appender name="CA" class="org.apache.log4j.AsyncAppender">
    <param name="BufferSize" value="512"/>
    <appender-ref ref="CA_OUTPUT"/>
</appender>
<appender name="CA_OUTPUT" class="org.apache.log4j.ConsoleAppender">
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="[%p] %d %c %M - %m%n"/>
    </layout>
</appender>

<logger name="org.hibernate.SQL" additivity="false">
    <level value="DEBUG"/>
    <appender-ref ref="CA"/>
</logger>

<root>
    <level value="WARN"/>
    <appender-ref ref="CA"/>
</root>

4 голосов
/ 02 марта 2013

Если вы хотите видеть точные запросы вместе со значениями параметров и возвращаемыми значениями, вы можете использовать прокси-драйвер jdbc.Он будет перехватывать все вызовы jdbc и записывать их значения.Некоторые прокси:

  • log4jdbc
  • jdbcspy

Они также могут предоставлять некоторые дополнительные функции, такие как измерение времени выполнения запросов и сбор статистики.

1 голос
/ 01 июля 2016

Кроме того, если вы используете WildFly / JBoss, установите для уровня ведения журнала org.hibernate значение DEBUG

Hibernate Logging in WildFly

0 голосов
/ 23 марта 2019

Если вы используете Spring Framework.Измените файл application.properties , как показано ниже

#Logging JPA Queries, 1st line Log Query. 2nd line Log parameters of prepared statements 
logging.level.org.hibernate.SQL=DEBUG  
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE  

#Logging JdbcTemplate Queries, 1st line Log Query. 2nd line Log parameters of prepared statements 
logging.level.org.springframework.jdbc.core.JdbcTemplate=DEBUG  
logging.level.org.springframework.jdbc.core.StatementCreatorUtils=TRACE  
0 голосов
/ 30 декабря 2018

С помощью Spring Boot просто добавьте: spring.jpa.show-sql = true в application.properties. Это покажет запрос, но без фактических параметров (вы увидите? Вместо каждого параметра).

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