2

p6spy は hibernate クエリのデバッグに非常に便利ですが、Hibernate と同じロジックでクエリをフォーマットする方法はありますか? :

<property name="hibernate.format_sql" value="true" />

p6spy ログの例: p6spy - 1339663561390|15|0|statement|select personne0_.id as id5_,personne0_.dateNaissance as dateNais2_5_, personne0_.nom as nom5_, personne0_.prenom as prenom5_, personne0_.type as type5_ from Personne personne0_ where personne0_.nom=?|select personne0_.id as id5_, personne0_.dateNaissance as dateNais2_5_, personne0_.nom as nom5_, personne0_.prenom as prenom5_, personne0_.type as type5_ from Personne personne0_ where personne0_.nom='example'

休止ログの例:

Hibernate: 
    insert 
    into
        TABLE
        (COLUMN_1, COLUMN_2) 
    values
        (?, ?)

hibernate 形式の方が読みやすいと思います。p6spy でこのようなものが必要です。

ありがとうございました。

4

1 に答える 1

2

P6Spy は SQL ステートメントをキャプチャし、「そのまま」ログに記録します。いかなる種類のフォーマットもまったく試みません。ただし、P6Spy は、探している動作を持つように簡単に拡張できます。これがどのように機能するかは、バージョン 1.3 と 2.0 の間で異なります (2.0 の方が簡単です)。

1.3 - 現在使用しているロガーをサブクラス化し、logSQL(...) メソッドをオーバーライドします。たとえば、FileLogger を使用している場合、サブクラスは次の例のようになります。コンパイル済みのクラスをクラスパスに配置したら、spy.properties を更新して新しいロガー実装を使用するだけです。

public class MyLogger extends FileLogger {
  public void logSQL(int connectionId, String now, long elapsed, String category, String prepared, String sql) {
    super.logSQL(connectionId,now,elapsed,category,reformat(prepared),reformat(sql));
  }
  private String reformat(final String sql) {
    // formatting logic goes here
  }
}

2.0 - 2.0 では、ログ メッセージのフォーマットを処理する新しい戦略インターフェイスを追加しました。これは、新しいロガーを提供するのとほぼ同じ量の作業ですが、すべてのロガーで使用されます。MessageFormattingStrategy インターフェイスを実装するクラスを提供する必要があるだけです。p6spy で新しい戦略を使用するには、spy.properties で構成するか、システム プロパティを設定します。詳細については、構成ドキュメントを参照してください。例として、MultiLineFormatを見てください。

ところで、新しいフォーマット戦略を作成して共有したい場合は、プル リクエストを送ってください。P6Spy は現在GitHubでメンテナンスされています。

于 2013-12-20T17:59:46.203 に答える