如何拦截Hibernate生成的SQL?

对于一个像大哥一样工作的安全系统(就像一个受监视的强制访问控制),我们必须拦截并处理hibernate生成的所有select语句。 我们将用户,时间戳和sql select存储在数据库中,以便使用其他工具进行一些分析。 这些信息可以确定用户试图查看的内容。 对于select语句,准备好的属性很有价值。 我们需要包含所有参数的完整SQL语句。

是否有任何监听器或拦截器可以加入并处理所有这些事情? 到目前为止,最大的突出问题是收集语句参数。

谢谢

当org.hibernate包的日志记录级别设置为DEBUG并且设置了hibernate.show_sql属性时,实际参数值碰巧可用(至少我的知识) 。 如果您想在数据库本身输出记录器,请使用JDBCAppender。

或者,您可以查看log4jdbc项目 ,该项目声称如下:

在记录的输出中,对于预准备语句,绑定参数会自动插入到SQL输出中。 这大大提高了许多情况下的可读性和调试性。

如果这不合适,您可以调查是否可以在您的情况下使用P6Spy 。 在WebLogic Server上,等效function是通过WebLogic JDBC Spy实现的, WebLogic JDBC Spy与某些数据库的WebLogic JDBC驱动程序一起开箱即用。 这两个都写入System.out而不是数据库(除非我弄错了),所以它可能没那么有用。

您可以使用Interceptor.prepareSQL() (3.1+)来拦截准备好的语句。

我不认为你可以获得实际的参数而不用在抽象层中。 可能的解决方案是使用JDBC代理驱动程序(请参阅P6Spy )。

希望有所帮助。