[java] JPA에서 발행 한 SQL 쿼리를 보는 방법은 무엇입니까?

내 코드가 다음과 같은 호출을 발행하면

entityManager.find(Customer.class, customerID);

이 호출에 대한 SQL 쿼리를 어떻게 볼 수 있습니까? 호출을 프로파일 링 / 모니터링하기 위해 데이터베이스 서버에 액세스 할 수 없다고 가정하면 JPA 호출에 의해 발행 된 해당 SQL 쿼리를 IDE에서 기록하거나 볼 수있는 방법이 있습니까? jTDS 드라이버를 사용하여 SQL Server 2008 R2에 반대합니다.



답변

로깅 옵션은 공급자마다 다릅니다. 어떤 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.


답변

또한 EclipseLink를 사용 중이고 SQL 매개 변수 값을 출력하려는 ​​경우이 특성을 persistence.xml 파일에 추가 할 수 있습니다.

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


답변

최대 절전 모드 및 로그 백을 로거로 사용하는 경우 다음을 사용할 수 있습니다 (결과가 아닌 바인딩 만 표시).

<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>


답변

EclipseLink에서 런타임시 특정 쿼리에 대한 SQL을 가져 오려면 DatabaseQuery API를 사용할 수 있습니다.

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을 얻는 방법


답변

OpenJPA에서 모든 SQL 및 매개 변수를 보려면 다음 두 매개 변수를 persistence.xml에 두십시오.

<property name="openjpa.Log" value="DefaultLevel=WARN, Runtime=INFO, Tool=INFO, SQL=TRACE"/>
<property name="openjpa.ConnectionFactoryProperties" value="PrintParameters=true" />


답변

매개 변수 값과 반환 값을 사용하여 정확한 쿼리를 모두 보려면 jdbc 프록시 드라이버를 사용할 수 있습니다. 모든 jdbc 호출을 가로 채고 값을 기록합니다. 일부 프록시 :

  • log4jdbc
  • jdbcspy

또한 쿼리 실행 시간 측정 및 통계 수집과 같은 몇 가지 추가 기능을 제공 할 수도 있습니다.


답변

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>