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") &&
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로 설정합니다.
스프링 프레임워크를 사용하는 경우.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
'source' 카테고리의 다른 글
| vue cli - 수집되지 않은 구문 오류:예기치 않은 토큰 < (0) | 2022.08.31 |
|---|---|
| 목록/어레이 목록 정렬 방법 (0) | 2022.08.31 |
| javadoc에서 메서드 파라미터에 참조를 추가하는 방법 (0) | 2022.08.31 |
| C 디폴트 인수 (0) | 2022.08.31 |
| 프로젝트 후반부에서 Vue.js를 스탠드아론 빌드에서 런타임 전용 빌드로 변경하시겠습니까? (0) | 2022.08.31 |
