SpringBoot - Spring Data Jpa Tuning

¡Continúe creando, acelere el crecimiento! Este es el 4to día de mi participación en el "Nuggets Daily New Plan · June Update Challenge", haz clic para ver los detalles del evento

Hibernate es muy conveniente en el desarrollo rápido, pero debido a la complejidad de sql en el proceso de consulta y el problema de consulta N+1, no se usa mucho en China. A continuación, se proporcionan algunas soluciones de ajuste para el problema de consulta N+1 como referencia. solamente.

N+1 consultas resultantes de ejecutar el método de consulta

Consulta de criterios

Use el método fetch en el método Specification.toPredicate. El método de escritura es el siguiente. Después del uso, la consulta se relacionará con la consulta. Sin embargo, para el atributo de la entidad de colección, se generarán datos incorrectos. No se recomienda utilizar este método para consultar el atributo de la colección.

   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()]));
   }
复制代码

La consulta de paginación necesita agregar un juicio, porque la consulta de paginación verificará el conteo primero

   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") donde xxx es el atributo específico en la entidad

Consulta con @Query

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

复制代码

Otro: recuperar todas las propiedades consulta agresivamente todas las propiedades, pero las propiedades de la colección no se encuentran automáticamente

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

Consultas N+1 resultantes de entidades serializadas

nota de fondo

Se explican dos configuraciones antes del ajuste:

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

Una vez habilitada la configuración, se llamará al atributo marcado como Lazy durante el proceso de serialización JSON de la entidad que regresa a la página principal, lo que desencadenará una consulta secundaria. Si no está activado, las siguientes dos excepciones no ocurrirán en el ciclo de serialización que regresa al frente del sistema.

//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];
复制代码

Solución

  • La mejor manera de serializar json es usar @JsonIgnore para ignorar las propiedades de la colección y obtener las propiedades de la entidad.
  • Convertir entidad a vo en servicio

Referencias

yq.aliyun.com/articles/23…

www.cnblogs.com/lcchuguo/p/…

www.java2s.com/Tutorials/J...

docs.jboss.org/hibernate/o…

Supongo que te gusta

Origin juejin.im/post/7102686972417671181
Recomendado
Clasificación