sql >> Base de Datos >  >> RDS >> Mysql

Cómo obtener registros coincidentes exactos en Spring JPA @Query

Eso no es tan fácil porque Hibernate/JPA intenta garantizar que el modelo de entidad esté sincronizado con el estado de la base de datos. Aparentemente, desea una proyección que probablemente no deba mantenerse sincronizada con la base de datos. Si realmente debe hacer esto, puede usar la siguiente consulta, pero tenga en cuenta que esto podría provocar la eliminación de elementos de servicio en la colección que no coincidan con los criterios:

@Query(value = "SELECT DISTINCT req FROM request req JOIN FETCH req.services srvs WHERE (srvs.status = :serviceStatus)")
List<Request> getAll(@Param("serviceStatus") String serviceStatus);

Esto generalmente se maneja mediante la introducción de DTO y creo que este es un caso de uso perfecto para Vistas de entidad de persistencia de Blaze .

Creé la biblioteca para permitir un mapeo fácil entre los modelos JPA y la interfaz personalizada o los modelos definidos por clases abstractas, algo así como Spring Data Projections con esteroides. La idea es que defina su estructura de destino (modelo de dominio) de la manera que desee y asigne atributos (captadores) a través de expresiones JPQL al modelo de entidad.

Un modelo DTO para su caso de uso podría tener el siguiente aspecto con Blaze-Persistence Entity-Views:

@EntityView(Request.class)
public interface RequestDto {
    @IdMapping
    Integer getId();
    String getStatus();
    @Mapping("services[status = :serviceStatus]")
    Set<ServiceDto> getServices();

    @EntityView(Service.class)
    interface ServiceDto {
        @IdMapping
        Integer getId();
        Integer getRequestId();
        String getStatus();
    }
}

Consultar es una cuestión de aplicar la vista de entidad a una consulta, siendo la más simple solo una consulta por id.

RequestDto a = entityViewManager.find(entityManager, RequestDto.class, id);

La integración de Spring Data le permite usarlo casi como Spring Data Projections:https://persistence.blazebit.com/documentation/entity-view/manual/en_US/index.html#características-de-datos-de-primavera

List<RequestDto> findAll(@OptionalParam("serviceStatus") String serviceStatus);

¡La mejor parte es que solo obtendrá el estado que realmente es necesario!