如何解决N + 1选择问题?
我无法理解如何在jpa或hibernate中避免n + 1选择。
从我读到的,有’左连接提取’,但我不确定它是否仍然适用于多个列表(oneToMany)..
有人可以向我解释一下,或者给我一个明确完整解释的链接吗?
如果这是一个菜鸟问题,我很抱歉,但我找不到关于这个问题的真正明确的文章或文档。
谢谢
除了加入,您还可以使用子选择。 这导致执行2个查询(或者通常m + 1,如果你有m个列表),但它也可以很好地扩展到大量列表,这与连接提取不同。
使用连接提取,如果您使用实体获取2个表(或列表),则会得到一个笛卡尔积 ,即两个表中的所有行对的组合。 如果表很大,结果可能很大 ,例如,如果两个表都有1000行,则笛卡尔积包含100万行!
这种情况的更好选择是使用子选择。 在这种情况下,您将在主选择(加载父实体)的顶部发出2个选择 – 每个表一个 – 所以总共加载1 + 100 + 100行和3个查询。
对于记录,与延迟加载相同将导致201个单独的选择,每个选择加载一行。
更新:以下是一些示例:
- 一个教程: 调整Lazy Fetching ,有一个关于子选择的部分到最后(顺便说一下,它还解释了n + 1选择问题和所有处理它的策略),
- 来自Hibernate引用的HQL子查询的示例 ,
- 以防万一, 关于从Hibernate引用获取策略的章节 – 与第一个类似的内容,但更加彻底
- 如何从hibernate查询中获取java.util.Map?
- 如何配置maven hbm2hbmxml和hbm2java在mvn clean install中依次运行
- 使用Hibernate JPA 2.1将应用程序部署到IBM WebSphere会产生NullPointerException
- Sprint引导数据JPA:没有类型为’java.util.Set ‘的限定bean
- 来自HBM文件的POJO
- 当两个表具有相同的列名时,NonUniqueDiscoveredSqlAliasException
- Spring,Hibernate和JPA:在entitymanager上调用persist似乎没有提交数据库
- JDBC Hibernate – Mysql连接错误
- Hibernate Mapping – 使用关联表连接两个表 – 但是有一个扭曲