持续创作,加速成长!这是我参与「日新计划 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…