sql >> Databáze >  >> RDS >> Mysql

Jak načíst přesné odpovídající záznamy v Spring JPA @Query

To není tak snadné, protože Hibernate/JPA se snaží zaručit, že model entity je synchronizovaný se stavem databáze. Zjevně chcete projekci, která by s největší pravděpodobností neměla být synchronizována s databází. Pokud to opravdu musíte udělat, můžete použít následující dotaz, ale mějte na paměti, že to může způsobit smazání prvků služby v kolekci, které neodpovídají kritériím:

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

To se obvykle řeší zavedením DTO a myslím, že je to perfektní případ použití pro Blaze-Persistence Entity Views .

Vytvořil jsem knihovnu, abych umožnil snadné mapování mezi modely JPA a uživatelským rozhraním nebo modely s abstraktními třídami, něco jako Spring Data Projections na steroidech. Myšlenka je taková, že definujete svou cílovou strukturu (model domény) tak, jak se vám líbí, a mapujete atributy (gettery) pomocí výrazů JPQL na model entity.

Model DTO pro váš případ použití by mohl vypadat takto s 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();
    }
}

Dotazování je záležitostí použití pohledu entity na dotaz, nejjednodušší je pouze dotaz podle id.

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

Integrace Spring Data vám umožňuje používat je téměř jako Spring Data Projections:https://persistence.blazebit.com/documentation/entity-view/manual/en_US/index.html#spring-data-features

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

Nejlepší na tom je, že získá pouze stav, který je skutečně nezbytný!



  1. Vyberte N náhodných záznamů na skupinu

  2. PHP:proč nemohu dvakrát opakovat výsledky mysqli_fetch_array()?

  3. Srovnávání výkonu MySQL:MySQL 5.7 vs MySQL 8.0

  4. 1064, Máte chybu v syntaxi SQL;... Python MySQL