JPA Hibernate查询n+1问题,关联实体查询加载慢优化

项目场景:

提示:在使用JPA列表查询查询,明细表关联主表信息,这时查询异常慢需要20s+接口才能返回
例如:学生表关联班级表,多个学生关联一个班级. 在对学生表列表查询并关联查询班级表时,JPA查询发送了n+1条查询语句(n为数据条数)


问题描述:

这里加入伪代码:

/**
 * 班级表
 **/
 @Entity
 @Table(name="student_class")
class StudentClass{
	/**
	 * 班级名称
	 **/
	 private String className;
}
/**
 * 学生表
 **/
 @Entity
 @Table(name="student")
class Student{
	/**
	 * 学生名称
	 **/
	 private String studentName;
	
	/**
	 * 学生所属班级
	 **/ 
	 @MantyToOne
	 @JoinColumn(name="student_class_id")
	 private StudentClass studentClass;
}

在调用StudentRepository.findAll()方法时查询缓慢:

class StudentRepository{

	List<Student> findAll();
	
}

原因分析:

看控制台的SQL信息;

  1. 第一条查询student表的sql
  2. 针对每一条student数据,发送了查询student_class表的SQL
  3. 这样就对数据库进行了N+1次查询
我想原因就在这里,在sql查询中建立连接进行查询是非常耗时的

解决方案:

使用@NamedEntityGraph注解让数据一次加载完毕,减少查询次数
在Student类中加入注解

/**
 * 学生表
 **/
 @Entity
 @Table(name="student")
 @NamedEntityGraph(name = "Student.Graph", attributeNodes = {
        @NamedAttributeNode(value = "studentClass")
class Student{
	/**
	 * 学生名称
	 **/
	 private String studentName;
	
	/**
	 * 学生所属班级
	 **/ 
	 @MantyToOne
	 @JoinColumn(name="student_class_id")
	 private StudentClass studentClass;
}

修改StudentRepository的findAll方法

class StudentRepository{

	@EntityGraph(value="Student.Graph", type = EntityGraph.EntityGraphType.FETCH)
	List<Student> findAll();
	
}

这样改造后,控制台只发送了一条SQL语句:
优化前: >20s
优化后: <3s

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值