2

p6spy 对于调试休眠查询非常有用,但是,有什么方法可以使用与休眠相同的逻辑来格式化查询?:

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