Spring-data-jpa的n+1問題
當我們使用JPA提供給我們的find方法時,如果查詢出來的對象關聯着另外10個對象,那么JPA將會發送1+10次查詢(這個對象本身要查詢一次,然后每個關聯對象再查詢一次)
解決方案:
1.使用FetchType.EAGER+FetchMode.JOIN 的形式,使得可以自動生成一條帶有LEFT OUTER JOIN 的SQL語句(前提:必須存在主外鍵關聯,否則無效)

例如:

此時,即使設置了FetchType.EAGER+FetchMode.JOIN,同樣會存在N+1的問題。
2.使用JPA2.1特性 @NamedEntityGraph注解,這是JPA推出專門優化解決JPA效率的注解。使用方式如下。
先在實體類上做聲明:

然后再在Repository接口中使用@EntityGraph引用

<注>可以根據不同的問題場景,定義不同的@NamedEntityGraph,切記不要關聯與業務無關的關聯對象,因為會去進行JOIN表,會造成不必要的性能損耗。
關於在Spring-data-jpa框架下使用Hibernate Predicate時解決N+1問題
解決方案同Spring-data-jpa,區別是,由於在Hibernate 的Predicate中調用的是JpaSpecificationExecutor中的findAll,所以需要在Repository中覆蓋對應的findAll方法,然后添加對應的EntiryGraph的注解,例如

3.使用batchSize(size=10) 進行批處理
4.使用懶加載

