Det er ikke så let, fordi Hibernate/JPA forsøger at garantere, at enhedsmodellen er synkroniseret med databasetilstanden. Du vil tilsyneladende have en projektion, som sandsynligvis ikke bør holdes synkroniseret med databasen. Hvis du virkelig skal gøre dette, kan du bruge følgende forespørgsel, men vær opmærksom på, at dette kan forårsage sletning af serviceelementer i samlingen, som ikke matcher kriterierne:
@Query(value = "SELECT DISTINCT req FROM request req JOIN FETCH req.services srvs WHERE (srvs.status = :serviceStatus)")
List<Request> getAll(@Param("serviceStatus") String serviceStatus);
Dette håndteres normalt ved at introducere DTO'er, og jeg tror, at dette er et perfekt brugstilfælde for Blaze-Persistence Entity Views .
Jeg oprettede biblioteket for at tillade nem kortlægning mellem JPA-modeller og brugerdefinerede interface eller abstrakte klassedefinerede modeller, noget som Spring Data Projections på steroider. Ideen er, at du definerer din målstruktur (domænemodel) som du kan lide og kortlægger attributter (getters) via JPQL-udtryk til entitetsmodellen.
En DTO-model til din brugssag kunne se ud som følgende med 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();
}
}
Forespørgsel er et spørgsmål om at anvende enhedsvisningen på en forespørgsel, den enkleste er blot en forespørgsel efter id.
RequestDto a = entityViewManager.find(entityManager, RequestDto.class, id);
Spring Data-integrationen giver dig mulighed for at bruge den næsten som 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);
Det bedste er, det vil kun hente den tilstand, der faktisk er nødvendig!