SpringBoot-Spring Data Jpa调优

简介: N+1查询 使用JpaSpecificationExecutor来查询 在Specification.toPredicate 方法中使用fetch方法,写法如下,使用之后查询会关联查询,但是对于集合实体这种属性会产生错误数据,不建议集合属性使用这种方式查询。

N+1查询

使用JpaSpecificationExecutor来查询

在Specification.toPredicate 方法中使用fetch方法,写法如下,使用之后查询会关联查询,但是对于集合实体这种属性会产生错误数据,不建议集合属性使用这种方式查询。

   public Predicate toPredicate(Root<实体> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
    root.fetch("xxx");
    ...
    List<Predicate> predicates = new ArrayList<>();
    return criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()]));
   }

分页查询则需要增加一个判断,因为分页查询会先查一下count

   public Predicate toPredicate(Root<实体> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
    if(criteriaQuery.getResultType().equals(实体.class)){
     root.fetch("xxx"); 
    }
    ...
    List<Predicate> predicates = new ArrayList<>();
    return criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()]));
   }

使用@Query查询

 @Query(value = "select d from Document d join fetch e.filetype ")
 List<User> findDocuments();

黑科技:fetch all properties 积极查询所有属性,但是集合属性不会自动feach

 @Query(value = "select d from Document d fetch all properties")
 List<User> findDocuments();

序列化实体导致的N+1查询

解决方法

  • 对于json序列化最好的方式是使用@JsonIgnore来忽略集合属性,fetch实体属性。
  • 在service中将实体转换为vo

参考资料

https://yq.aliyun.com/articles/2378 
https://www.cnblogs.com/lcchuguo/p/5327738.html 
http://www.java2s.com/Tutorials/Java/JPA/4700__JPA_Query_Join_Fetch.htm 
https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html



目录
相关文章
|
1月前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
238 37
|
1天前
|
存储 Java API
如何使用 Java 记录简化 Spring Data 中的数据实体
如何使用 Java 记录简化 Spring Data 中的数据实体
23 9
|
2天前
|
SQL Java 关系型数据库
Springboot引入jpa来管理数据库
Springboot引入jpa来管理数据库
8 0
Springboot引入jpa来管理数据库
|
2天前
|
SQL Java 数据库连接
springBoot+Jpa(hibernate)数据库基本操作
springBoot+Jpa(hibernate)数据库基本操作
10 0
|
1月前
|
Java 数据库连接 API
【Java笔记+踩坑】Spring Data JPA
从常用注解、实体类和各层编写方法入手,详细介绍JPA框架在增删改查等方面的基本用法,以及填充用户名日期、分页查询等高级用法。
【Java笔记+踩坑】Spring Data JPA
|
2月前
|
Java Spring 数据库
怎样动动手指就能实现数据操作?Spring Data JPA背后的魔法揭秘
【8月更文挑战第31天】在Java开发中,数据库交互至关重要。传统的JDBC操作繁琐且难维护,而Spring Data JPA作为集成JPA的数据访问层解决方案,提供了CRUD等通用操作接口,显著减少代码量。通过继承`JpaRepository`,开发者能轻松实现数据的增删改查,甚至复杂查询和分页也不再困难。本文将通过示例详细介绍如何利用Spring Data JPA简化数据访问层的开发,提升代码质量和可维护性。
31 0
|
2月前
|
存储 Java 数据库
|
19天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的服装商城管理系统
基于Java+Springboot+Vue开发的服装商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的服装商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
55 2
基于Java+Springboot+Vue开发的服装商城管理系统
|
19天前
|
前端开发 JavaScript Java
SpringBoot项目部署打包好的React、Vue项目刷新报错404
本文讨论了在SpringBoot项目中部署React或Vue打包好的前端项目时,刷新页面导致404错误的问题,并提供了两种解决方案:一是在SpringBoot启动类中配置错误页面重定向到index.html,二是将前端路由改为hash模式以避免刷新问题。
92 1
|
17天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的大学竞赛报名管理系统
基于Java+Springboot+Vue开发的大学竞赛报名管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的大学竞赛报名管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
38 3
基于Java+Springboot+Vue开发的大学竞赛报名管理系统