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 日志示例:
Hibernate:
insert
into
TABLE
(COLUMN_1, COLUMN_2)
values
(?, ?)
我认为 hibernate 格式更具可读性,我想要 p6spy 类似的东西。
谢谢。
最佳答案
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中,我们添加了一个新的策略接口(interface)来处理日志消息格式。这与提供新记录器的工作量大致相同,但它将被所有记录器使用。您只需要提供一个实现 MessageFormattingStrategy 接口(interface)的类。要使 p6spy 使用新策略,您只需在spy.properties 中配置它或设置系统属性。请参阅the configuration docs了解具体情况。例如,请查看 MultiLineFormat .
顺便说一句 - 如果您确实创建了新的格式化策略并想分享它,请向我们发送拉取请求。 P6Spy 现在维护在 GitHub .
关于hibernate - p6spy 日志与 Hibernate 日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11030697/