持续创作,加速成长!这是我参与「日新计划 6 月更文挑战」的第4天,点击查看活动详情

Hibernate在快速开发中十分方便,但由于查询过程中sql复杂,以及N+1查询问题导致国内使用不是很多,下面针对N+1查询问题提供一些调优方案仅供参考。

执行查询方法导致的N+1查询

Critjava环境变量配置eria查询

在Sjson怎么读pecification.toPredicate 方法中使用json怎么读fetch方法,写法如下,使用之后查询会关联查询,但是对于集合实体这种属事务所所长npc性会产生错误数据,不建议集合属性使用这种方式查询。

   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()]));
   }

分页查询则需要增加一个判断,因为分页查询会appearance先查一下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()]));
   }

root.fetch(“xxx”)其中xxx为实体中具体属性

使用@Query查询

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

其它:fetch ajson数据ll properties 积事务所所长npc极查询所有属性,但是集合属性不会自动feach

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

序列化实体导致java是什么意思的N+1查询

背景说明

调优之前先说明两个配置:

//是否支持当实体在没有标记事务的方法中访问设置为lazy的属性
spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true
//使用jackson序列化时 实体属性为lazy时是否报错
spring.jackson.serialization.FAIL_ON_EMPTY_BEANS = false

开启配置之后实体返回至前端页面json序列化过程中会调用标记为Lazy的属性,导致触发二approach次查询。
不开启则系统中序列化返回到前端这一环就不会出java是什么意思现下面这两个异java是什么意思常。

//List属性:
 com.fasterxml.jackson.databind.JsonMappingException: failed to lazily initialize a collection of 属性名: 实体.属性, could not initialize proxy - no Session
// 实体属性:
org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer];

解决方法

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

参考资料

yqappearance.aliyun.com/articlapplicationes/23…

www.cnblogs.com/java编译器lcchuguo/p/…

www.java2s.com/Tutorials/J…

docs.jboss.org/hibernat事务所所长的委托任务e/o…