關於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完成查詢
