解决Springboot+JPA中多表关联查询会查询多次的问题(n+1查询问题)


关于JPA、hibernate“臭名昭著”的n+1次查询,导致查询的性能问题
 
问题重现举例
查询列表页面,当查询涉及多表关联时,即页面中除显示主表字段,还显示从表字段

期望:一个sql完成,即select a.c1, a.c2.... from a, b where a.id = b.fkid ......

实际:JPA会发送多个sql完成,第一条语句查询主表,后面发送n条语句查询子表,即所谓“n+1”问题,实测截图中的sql如下,共发送多条sql完成查询

 

修复方案

1、在实体上面注解@NamedEntityGraph,指明name供查询方法使用,attributeNodes 指明被标注为懒加载的属性节点

eg: @NamedEntityGraph(name = "CfgComponent.Graph", attributeNodes = {@NamedAttributeNode("type")})

2、在repository的查询方法上面注解@EntityGraph,value属性值为@NamedEntityGraph的name属性值

eg: @EntityGraph(value = "CfgComponent.Graph", type = EntityGraph.EntityGraphType.FETCH)

 修复后,重新测试,只发送一个sql完成查询

 




免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM