【问题标题】:Hibernate query logging - log from entity nameHibernate 查询日志记录 - 从实体名称记录
【发布时间】:2021-09-01 05:07:44
【问题描述】:

我通过在我的 application.properties 中设置以下配置来在 Hibernate 中使用查询日志记录

logging.level.org.springframework.transaction.interceptor=DEBUG
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=DEBUG

这很好用并记录查询。我需要通过在开头添加一个表名来增强此日志记录,我从哪个表中选择数据。例如。我记录了以下查询:

2021-06-16 13:11:18.008 DEBUG 6544 --- [io-8080-exec-10] org.hibernate.SQL : select count(program0_.id) as col_0_0_ from public.program program0_ where 1=1
2021-06-16 13:11:18.008 DEBUG 6544 --- [io-8080-exec-10] org.hibernate.SQL : select count(user_0 .id) as col_0_0_ from public.user user_0 where 1=1

这些查询很简单,很容易确定是从表programuser 中查询到的数据。但是在大查询的情况下,开头的表名会简化日志的检查。

有什么选项可以在 Hibernate 中设置吗?

【问题讨论】:

  • 如果选择了多个表中的数据会怎样呢?或者甚至没有使用表,但使用了 CTE,或者......起初,您的解决方案可能听起来是个好主意,对于复杂的用例,它会开始快速崩溃/恶化。
  • 你总是在'from'子句中指定一个表,所以我想看看那里指定的表。
  • 如果没有使用表,该字段保持为空。
  • 好吧,在 CTE 的情况下,它只是该查询的别名。但是,如果不解析字符串并希望有一个 FROM 你可以相信它是行不通的。

标签: java spring hibernate spring-data-jpa spring-data


【解决方案1】:
  1. Hibernate 没有这样的选项。

  2. cmets 已经描述了需求定义不明确,因为您可以在任何 SQL 语句中拥有任意数量的表,包括 0,因此通用解决方案相当棘手。

  3. 但是你可以自己做这样的事情。

    例如,如果您使用 Logback,您可能会注册一个自定义 layout 来解析消息,如果找到 SQL 语句,它会从中提取表。

    或者您可以使用您用来收集和整合日志的工具链对日志进行后处理

【讨论】:

  • 是的,日志后处理当然是一种选择。我只是在开发环境中易于配置和使用的东西,其中日志只是输出到控制台(而不是存储在 Kibana 或其他一些日志可视化器中)。所以我所追求的是 Hibernate 中的一个这样的选项 - 如果没有,那么它超出了范围。
猜你喜欢
  • 1970-01-01
  • 2023-02-14
  • 1970-01-01
  • 2011-09-01
  • 2012-03-12
  • 2021-09-17
  • 1970-01-01
  • 2017-09-22
  • 1970-01-01
相关资源
最近更新 更多