source

JPA에서 발행한SQL 쿼리를 표시하는 방법

goodcode 2022. 8. 31. 22:40
반응형

JPA에서 발행한SQL 쿼리를 표시하는 방법

코드가 다음과 같은 콜을 발행하는 경우:

entityManager.find(Customer.class, customerID);

이 콜의 SQL 쿼리를 표시하려면 어떻게 해야 합니까?데이터베이스 서버에 액세스하여 콜을 프로파일/모니터링할 수 없는 경우 JPA 콜에 의해 발행된 대응하는 SQL 쿼리를 IDE 내에 기록 또는 표시할 수 있는 방법이 있습니까?jTDS 드라이버를 사용한SQL Server 2008 R2에 반대합니다.

로깅 옵션은 공급자에 따라 다릅니다.어떤 JPA 구현을 사용하고 있는지 알아야 합니다.

  • 휴지 상태(여기를 참조):

    <property name = "hibernate.show_sql" value = "true" />
    
  • Eclipse Link(여기를 참조):

    <property name="eclipselink.logging.level" value="FINE"/>
    
  • Open JPA(여기를 참조):

    <property name="openjpa.Log" value="DefaultLevel=WARN,Runtime=INFO,Tool=INFO,SQL=TRACE"/>
    
  • Data Nucleus(여기를 참조):

    로그 카테고리 설정DataNucleus.Datastore.Native그런 수준까지DEBUG.

또한 EclipseLink를 사용하고 SQL 매개 변수 값을 출력하려면 persistence.xml 파일에 다음 속성을 추가할 수 있습니다.

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

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.internate 를 선택합니다.SQL=Query 인쇄

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

org.internate 를 선택합니다.type=SYSTEM은 바인딩을 인쇄하고 일반적으로 사용자 지정 필터를 통해 억제되는 결과를 출력합니다.

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

실행 시 특정 쿼리에 대한 SQL을 가져오는 EclipseLink에서 데이터베이스를 사용할 수 있습니다.쿼리 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을 얻는 방법

다른 사람에게 도움이 될 만한 커닝 시트를 만들었습니다.모든 예에서 다음 명령어를 삭제할 수 있습니다.format_sql기록된 쿼리를 한 줄에 보관하는 경우(예쁜 인쇄가 필요 없음) 속성을 선택합니다.

준비된 문장의 매개 변수나 로깅 프레임워크 최적화 없이 표준화할 SQL 쿼리 인쇄:

application.properties파일:

spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true

application.yml파일:

spring:
  jpa:
    show-sql: true
    properties:
      hibernate:
        format_sql: true

로깅 프레임워크를 사용하여 준비된 문의 매개 변수를 사용하여 SQL 쿼리를 예쁘게 인쇄합니다.

application.properties파일:

spring.jpa.properties.hibernate.format_sql=true
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE

application.yml파일:

spring:
  jpa:
    properties:
      hibernate:
        format_sql: true
logging:
  level:
    org:
      hibernate:
        SQL: DEBUG
        type:
          descriptor:
            sql:
              BasicBinder: TRACE

로그 프레임워크를 사용하여 준비된 문의 매개 변수를 사용하지 않고 SQL 쿼리를 예쁘게 인쇄합니다.

application.properties파일:

spring.jpa.properties.hibernate.format_sql=true
logging.level.org.hibernate.SQL=DEBUG

application.yml파일:

spring:
  jpa:
    properties:
      hibernate:
        format_sql: true
logging:
  level:
    org:
      hibernate:
        SQL: DEBUG

출처 (및 상세) : https://www.baeldung.com/sql-logging-spring-boot

OpenJPA의 모든 SQL과 파라미터를 표시하려면 persistence.xml에 다음 2개의 파라미터를 입력합니다.

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

로그가 너무 많아서 임시로만 저장하려는 경우 다른 좋은 옵션입니다.System.out.println()프로바이더에 따라 다음 작업을 수행할 수 있습니다.

CriteriaBuilder criteriaBuilder = getEntityManager().getCriteriaBuilder();
CriteriaQuery<ExaminationType> criteriaQuery = criteriaBuilder.createQuery(getEntityClass()); 

/* For Hibernate */
System.out.println(getEntityManager().createQuery(criteriaQuery).unwrap(org.hibernate.query.Query.class).getQueryString());

/* For OpenJPA */ 
System.out.println(getEntityManager().createQuery(criteriaQuery).unwrap(org.apache.openjpa.persistence.QueryImpl.class).getQueryString());

/* For EclipseLink */
System.out.println(getEntityManager().createQuery(criteriaQuery).unwrap(JpaQuery.class).getSQLString());

또한 WildFly/JBoss를 사용하는 경우 org.hibernate의 로깅 수준을 DEBUG로 설정합니다.

WildFly에서의 휴지 상태 로깅

스프링 프레임워크를 사용하는 경우.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  

Spring JPA 벤더 어댑터를 사용하여 SQL 표시를 중지시킬 수 없음를 참조하십시오.

Spring Boot에 spring.jpa를 추가합니다.show-sql=application.properties에 대한 참입니다.그러면 쿼리가 표시되지만 실제 파라미터는 표시되지 않습니다(각 파라미터 대신 ?가 표시됩니다).

시험 개발 중 SQL 디버깅로깅을 체크하는 특정 메서드에 초점을 맞추기 위해 다음 logger 문을 사용하여 메서드를 꾸밉니다.

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ch.qos.logback.classic.Level;

((ch.qos.logback.classic.Logger) LoggerFactory.getLogger("org.hibernate.SQL")).setLevel(Level.DEBUG);
entityManager.find(Customer.class, customerID);
((ch.qos.logback.classic.Logger) LoggerFactory.getLogger("org.hibernate.SQL")).setLevel(Level.INFO);

SQL(persistence.xml 구성)을 출력하기 위한 Eclipse Link:

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

JPA 프로바이더가 설정할 수 있습니다.다른 사용자가 JPA 속성을 통해 제어하지 않는 경우를 제외합니다.

public static JpaProperties properties() {
        final JpaProperties jpaProperties = new JpaProperties();
        jpaProperties.setShowSql(true);

persistence라는 파일이 있습니다.xml Ctrl+Shift+R을 눌러 검색하면 showSQL과 같은 파일이 표시됩니다.

그냥 사실대로 말해.

서버를 디버깅 모드로 시작해야 하는지 잘 모르겠습니다.콘솔에서 생성된 SQL을 확인합니다.

언급URL : https://stackoverflow.com/questions/4362876/how-to-view-the-sql-queries-issued-by-jpa

반응형