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ý!