【发布时间】:2022-01-19 19:05:15
【问题描述】:
我正在使用 Spring Boot 和 Hibernate。
一些复杂的逻辑,由业务决定,需要使用各种嵌套字段,这些字段遍历各种DB关系(同样有一些是NxN、Nx1、1xN、1x1)。
遇到了N+1的问题,一开始是用HQL解决的,但是有些查询需要多次join,结果集变得无法管理。
我开始研究一个自定义实用程序,该实用程序收集需要获取的事物的 id,一次获取所有内容,然后使用 setter 填充起始对象上的字段。此实用程序适用于多对一关系,但对于多对多关系仍然效率低下,因为当我收集 id 时它会退回到 N+1 问题(因为它通过 getter 对每个对象查询连接表一次)。
我该如何解决这个问题?这个问题真的还没有解决吗?我是否遗漏了一些自动解决此问题的明显设置?
编辑: 我做了一个带有一些评论的玩具示例:https://github.com/marcotama/n-1-queries-example
【问题讨论】:
-
你应该阅读“Spring boot persistence Best Practice (Anghel Leonard)”。这本书包含了关于休眠调优的非常好的推荐。我知道了很多陷阱。
-
您能否发布一个您尝试执行的 SQL 查询示例?这样就更容易提出解决方案(就像fixing
MultipleBagFetchException)。 -
@StefanGolubović 我添加了一个例子
标签: java spring performance hibernate jpa