• 解决 SpringData JPA 的n+1问题


    1. 首先解决 n+1 问题

    (1)Entity 添加 @NamedEntityGraph 

     1 @Entity
     2 @Table(name = "tb_depart_detail", schema = "")
     3 @NamedEntityGraph(name = "depart_detail.Graph", attributeNodes = {
     4         @NamedAttributeNode(value = "depart")
     5 })
     6 @SuppressWarnings("serial")
     7 public class DepartDetailEntity implements java.io.Serializable {
     8     @ManyToOne(fetch = FetchType.EAGER)
     9     @JoinColumn(name = "depart_id")
    10     public DepartEntity getDepart() {
    11         return depart;
    12     }
    13 
    14     public void setDepart(DepartEntity depart) {
    15         this.depart = depart;
    16     }
    17 }

    (2) 重写 JpaRepository 的API 指定使用 NameEntityGraph

     1 import com.doctor.assistant.userserver.springdata.entity.DepartDetailEntity;
     2 import org.springframework.data.jpa.repository.EntityGraph;
     3 import org.springframework.data.jpa.repository.JpaRepository;
     4 
     5 import java.util.List;
     6 
     7 public interface DepartDetailRepository extends JpaRepository<DepartDetailEntity, String> {
     8 
     9     @Override
    10     @EntityGraph(value = "depart_detail.Graph",type = EntityGraph.EntityGraphType.FETCH)
    11     List<DepartDetailEntity> findAll();
    12 }

    (3) Test 测试 :

    2. 三层及更多关联时,解决 n+1 的方式:

     1 @Entity
     2 @Table(name = "t_base")
     3 @Inheritance(strategy = InheritanceType.JOINED)
     4 @NamedEntityGraph(name = "base.Graph", attributeNodes = {
     5         @NamedAttributeNode(value = "someList"),
     6         @NamedAttributeNode(value = "userList", subgraph = "outterGraph")
     7 }
     8 ,subgraphs = {
     9         @NamedSubgraph(name = "outterGraph",attributeNodes = {
    10                 @NamedAttributeNode(value = "outterList",subgraph = "innerGraph")
    11         }),@NamedSubgraph(name = "innerGraph",attributeNodes = {
    12                 @NamedAttributeNode("innerList")
    13         })
    14 })

    3. 若想保留原接口,再写一个 Repository的实现类,其中什么也不做,即可保留原方法:

    1 @Repository
    2 public interface EAGERUserRepository extends JpaRepository<TSBaseUser, String> {
    3 }
  • 相关阅读:
    UINavigationController的简单使用
    UIApplication
    NSOperation开启线程情况分析
    NSOperation & NSOperationQueue
    GCD 多线程 Ios 补充
    GCD中不同队列 配合 不同函数的 情况分析
    GCD详解
    is,as,sizeof,typeof,GetType
    人人必知的10个jQuery小技巧
    移动设备wap手机网页html5通过特殊链接:打电话,发短信,发邮件详细教程
  • 原文地址:https://www.cnblogs.com/bridgestone29-08/p/13181477.html
Copyright © 2020-2023  润新知