私のコードが次のような呼び出しを発行すると:
entityManager.find(Customer.class, customerID);
この呼び出しのSQLクエリを確認するにはどうすればよいですか?呼び出しをプロファイル/監視するデータベースサーバーにアクセスできない場合、IDE内でJPA呼び出しによって発行された対応するSQLクエリを記録または表示する方法はありますか?jTDSドライバーを使用してSQL Server 2008 R2に反対します。
私のコードが次のような呼び出しを発行すると:
entityManager.find(Customer.class, customerID);
この呼び出しのSQLクエリを確認するにはどうすればよいですか?呼び出しをプロファイル/監視するデータベースサーバーにアクセスできない場合、IDE内でJPA呼び出しによって発行された対応するSQLクエリを記録または表示する方法はありますか?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
。
ロガーとして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.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>
TopLinkで実行時に特定のクエリの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とパラメーターを表示するには、以下の2つのパラメーターをpersistence.xmlに入れます。
<property name="openjpa.Log" value="DefaultLevel=WARN, Runtime=INFO, Tool=INFO, SQL=TRACE"/>
<property name="openjpa.ConnectionFactoryProperties" value="PrintParameters=true" />
正確なクエリをパラメーター値と戻り値と共に完全に表示する場合は、jdbcプロキシドライバーを使用できます。すべてのjdbc呼び出しをインターセプトし、それらの値をログに記録します。いくつかのプロキシ:
また、クエリの実行時間の測定や統計の収集など、いくつかの追加機能を提供する場合もあります。
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.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());
Springフレームワークを使用している場合。次のように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
他の人に役立つと思うチートシートを作成しました。すべての例でformat_sql
、ログに記録されたクエリを1行に保持したい場合(きれいに印刷しない場合)、プロパティを削除できます。
かなり標準出力に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
Spring Bootを使用して、application.propertiesにspring.jpa.show-sql = trueを追加するだけです。これはクエリを表示しますが、実際のパラメーターはありません(各パラメーターの代わりに?が表示されます)。
探索的な開発中に、SQLデバッグのログを確認したい特定のメソッドに集中させるために、次のロガーステートメントでそのメソッドを修飾します。
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);
persistence.xmlというファイルがあります。Ctrl+ Shift + Rを押して検索すると、showSQLのような場所が作成されます。
それを真実にしてください
サーバーをデバッグモードで起動する必要があるかどうかはわかりません。コンソールで作成されたSQLを確認します。