首页>>后端>>SpringBoot->SpringBoot

SpringBoot

时间:2023-12-01 本站 点击:0

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

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

Criteria查询

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

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

使用@Query查询

@Query(value = "select d from Document d join fetch e.filetype ")List<User> findDocuments();
其它:fetch all properties 积极查询所有属性,但是集合属性不会自动feach``` java @Query(value = "select d from Document d fetch all properties") List<User> findDocuments();

序列化实体导致的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的属性,导致触发二次查询。 不开启则系统中序列化返回到前端这一环就不会出现下面这两个异常。

//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];

解决方法

对于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

原文:https://juejin.cn/post/7102686972417671181


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/SpringBoot/6031.html