检索Hibernate执行的SQL查询

时间:2012-12-08 17:19:18

标签: hibernate jpa playframework playframework-1.x

我正在使用Play Framework,我想检索Hibernate执行的查询。

我知道application.conf中有一个设置(jpa.debugSQL = true)来在控制台中显示查询,但我想要做的是从代码中检索这些查询以便我自己为用户显示它们(就像网站上的管理界面一样,可以查看每个页面请求的查询)。

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

如果您熟悉log4j(或任何其他类似的日志记录框架),这应该很容易实现。

您可以编写一个自定义appender,它将配置为从org.hibernate.SQL接收所有事件(这是提供SQL输出的包)。这个appender会将所有事件都放入some FIFO buffer。这将允许您将最后n个日志条目保留在内存中。

其他,我想,就像在webapp中显示缓冲区内容一样简单。

编辑:事情的样子:

log4j config:

<appender name="backend-appender" class="your.package.BackendAppender">
   <param name="bufferSize" value="200"/>
   <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern" value="[%t]: %m - %c - %d %x%n"/>
   </layout>
</appender>

Java代码:

public class BackendAppender extends AppenderSkeleton {
   private Collection<LoggingEvent> buffer;
   private int bufferSize = 10;
   private Layout layout;

   @Override
   protected void append(LoggingEvent event) {
       buffer.add(event);
   }

   public void close() {
   }

   public boolean requiresLayout() {
      return false;
   }

   @Override
   public void activateOptions() {
       if (buffer == null) {
          buffer = new CircularFifoBuffer<>(bufferSize);
       }
       layout = getLayout();
   }

   public List<String> getHibernateLog() {
      List<String> list = new ArrayList<>();
      for (LoggingEvent event : buffer) {
          if (event == null) {
              continue;
          }
          list.add(layout.format(event));
          // check event.getThrowableInformation() -- it signals this was an exception rather than typical log line and you need to handle this differently

      }
   }