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 SpringBoot –性能分析与调优
Java SpringBoot –性能分析与调优
|
3月前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
464 37
|
2月前
|
存储 Java API
如何使用 Java 记录简化 Spring Data 中的数据实体
如何使用 Java 记录简化 Spring Data 中的数据实体
38 9
|
2月前
|
SQL Java 关系型数据库
Springboot引入jpa来管理数据库
Springboot引入jpa来管理数据库
47 0
Springboot引入jpa来管理数据库
|
2月前
|
SQL Java 数据库连接
springBoot+Jpa(hibernate)数据库基本操作
springBoot+Jpa(hibernate)数据库基本操作
53 0
|
3月前
|
Java 数据库连接 API
【Java笔记+踩坑】Spring Data JPA
从常用注解、实体类和各层编写方法入手,详细介绍JPA框架在增删改查等方面的基本用法,以及填充用户名日期、分页查询等高级用法。
【Java笔记+踩坑】Spring Data JPA
|
4月前
|
Java Spring 数据库
怎样动动手指就能实现数据操作?Spring Data JPA背后的魔法揭秘
【8月更文挑战第31天】在Java开发中,数据库交互至关重要。传统的JDBC操作繁琐且难维护,而Spring Data JPA作为集成JPA的数据访问层解决方案,提供了CRUD等通用操作接口,显著减少代码量。通过继承`JpaRepository`,开发者能轻松实现数据的增删改查,甚至复杂查询和分页也不再困难。本文将通过示例详细介绍如何利用Spring Data JPA简化数据访问层的开发,提升代码质量和可维护性。
45 0
|
4月前
|
存储 Java 数据库
|
Java Spring Kotlin
第2讲 Kotlin + Spring Boot 集成 JPA 【Kotlin + Spring Boot 服务端开发课程系列】
【Kotlin + Spring Boot 服务端开发课程系列】第2讲 Kotlin + Spring Boot 集成 JPA 【视频教程】 投影片01.
1076 0
|
Java Spring 测试技术
Spring Boot集成JPA的Column注解命名字段无效的问题
偶然发现,Spring Boot集成jpa编写实体类的时候,默认使用的命名策略是下划线分隔的字段命名。
4002 0