解决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完成查询