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

 



posted on 2019-01-14 10:42  wanbao  阅读(6141)  评论(0编辑  收藏  举报