博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java面试之n+1问题
阅读量:5061 次
发布时间:2019-06-12

本文共 2679 字,大约阅读时间需要 8 分钟。

在一对多或者多对多的时候。如果通过一的一方取获得多的一方的数据。除了第一次查询表的数据以外。每获得一条多的一方的数据就查询一次。

如:通过学生表的记录查询成绩表的记录。

一个学生就查询一次,50个学生就查询50次。

如果需要查询50个学生的成绩,需要查询数据库的次数为 第一次查询学生的记录+50次查询成绩的记录。这个情况我们成为 N+1.

//需求:查询所有的学生,以及所有学生都有查询他的成绩

@Test

public void find(){

//1.获得学生信息

EntityManager manager = JpaUtils.getEntityManager();

TypedQuery<Student> query = manager.createQuery("select s from Student s", Student.class);

List<Student> students = query.getResultList();

for (Student student : students) {

System.out.println("学生名:"+student.getStuName());

//每个学生都有获得他的成绩

List<Result> results = student.getResults();

for (Result result : results) {

System.out.println("分数:"+result.getResScore()+",科目:"+result.getResSubject());

}

}

 

manager.close();

}

 

对于一些对性能要不高的内部系统,其实N+1问题是可以接受。但对于要求性能高的系统是不可以使用的。

解决N+1问题的方法就是通过连接表查询,在JPQL里面通过fetch 设置生成SQL语句的策略

 

1 package cn.gzsxt.test; 2  3 import java.util.List; 4  5 import javax.persistence.EntityManager; 6 import javax.persistence.EntityTransaction; 7 import javax.persistence.TypedQuery; 8  9 import org.junit.Test;10 11 import cn.gzsxt.entity.Result;12 import cn.gzsxt.entity.Student;13 import cn.gzsxt.utils.JpaUtils;14 15 public class StudentTest {16     //需求:通过ID查询所有学生表的记录,同时查询该学生的对应的成绩的信息!17     @Test18     public void findResultByStudent(){19         EntityManager entityManager = JpaUtils.getEntityManager();20         TypedQuery
createQuery = entityManager.createQuery("select s from Student s",Student.class);21 List
students = createQuery.getResultList();22 for (Student student : students) {23 System.out.println("学生名:"+student.getStuName());24 List
results = student.getResults();25 for (Result result : results) {26 System.out.println(result.getResSubject()+":"+result.getResScore());27 }28 }29 entityManager.close();30 }31 //需求:通过ID查询所有学生表的记录,同时查询该学生的对应的成绩的信息!解决n+1问题32 @Test33 public void findResultByStudent2(){34 EntityManager entityManager = JpaUtils.getEntityManager();35 TypedQuery
createQuery = entityManager.createQuery("select distinct s from Student s inner join fetch s.results",Student.class);36 List
students = createQuery.getResultList();37 for (Student student : students) {38 System.out.println("学生名:"+student.getStuName());39 List
results = student.getResults();40 for (Result result : results) {41 System.out.println(result.getResSubject()+":"+result.getResScore());42 }43 }44 entityManager.close();45 }46 }

 

转载于:https://www.cnblogs.com/aczx/p/8809291.html

你可能感兴趣的文章
vimium
查看>>
python基础之数据类型
查看>>
EntityManager方法简介
查看>>
codeforce 830A Office Keys
查看>>
错误:【No configuration found for the specified action: 'login.action' in namespace: " " 】
查看>>
C# 窗体间传值方法大汇总(转)
查看>>
C#关于多线程的笔记
查看>>
js切换背景颜色
查看>>
[数据结构]哈希表
查看>>
php中global与$GLOBALS的用法及区别
查看>>
sleep
查看>>
爱因斯坦:再牛逼的伟人,也有苦逼的青春ZZ
查看>>
实战webpack系列04
查看>>
C# 字符串截取 tips
查看>>
XML中文显示问题
查看>>
对角线之和--通用
查看>>
面向过程与面向对象
查看>>
bzoj1030 文本生成器(AC自动机+dp)
查看>>
清北刷题10.23night
查看>>
制作一个表格,显示班级的学生信息
查看>>