web-dev-qa-db-ja.com

ログの詳細度を上げることなく、EclipseLinkを使用して生成されたSQLを出力することは可能ですか?

開発中に、EclipseLinkによって生成されたSQLをコンソールに出力したい。ただし、ロギングレベルFINEを使用する場合にのみ可能です。 EclipseLinkはモデル全体の分析を出力するため、私は多くのクラスで構成される複雑なドメインモデルを使用しています。ログの詳細度がFINEレベルである場合、展開にかなりの時間がかかります。

ログレベルFINE(H​​ibernateのように)に頼らずにSQLを取得する方法はありますか?

33
javabeats

以下のプロパティをpersistence.xml

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

後者は、パラメーターの値が表示されるので役立ちます。

別の方法は、 log4jdbc または log4jdbc-remix を使用することです。

58
jbandi

this threadによると、EclipseLinkのログ生成を設定するのは非常に難しいようです。

persistence.xml適応できるログレベルのファイル:

<property name="eclipselink.weaving" value="static" />
<property name="eclipselink.logging.level.sql" value="FINEST" />
<property name="eclipselink.logging.level" value="FINEST" />
<property name="eclipselink.logging.level.cache" value="FINEST" />

ただし、他のいくつかの設定が必要になる場合があります。

Martin ドキュメント と同様、 " EclipseLink/Examples/JPA/Logging "はそれらのプロパティをドキュメント化します。

22
VonC

実行時に特定のクエリの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を取得する方法

10
Tomasz