Det är inte så lätt eftersom Hibernate/JPA försöker garantera att enhetsmodellen är synkroniserad med databastillståndet. Du vill tydligen ha en projektion som antagligen inte bör hållas synkroniserad med databasen. Om du verkligen måste göra detta kan du använda följande fråga, men tänk på att detta kan orsaka radering av tjänstelement i samlingen som inte matchar kriterierna:
@Query(value = "SELECT DISTINCT req FROM request req JOIN FETCH req.services srvs WHERE (srvs.status = :serviceStatus)")
List<Request> getAll(@Param("serviceStatus") String serviceStatus);
Detta hanteras vanligtvis genom att introducera DTO:er och jag tror att detta är ett perfekt användningsfall för Blaze-Persistence Entity Views .
Jag skapade biblioteket för att möjliggöra enkel kartläggning mellan JPA-modeller och anpassade gränssnitt eller abstrakt klassdefinierade modeller, något som Spring Data Projections på steroider. Tanken är att du definierar din målstruktur (domänmodell) som du vill och mappar attribut(getters) via JPQL-uttryck till entitetsmodellen.
En DTO-modell för ditt användningsfall kan se ut så här 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();
}
}
Fråga är en fråga om att tillämpa entitetsvyn på en fråga, den enklaste är bara en fråga efter id.
RequestDto a = entityViewManager.find(entityManager, RequestDto.class, id);
Spring Data-integrationen låter dig använda den nästan 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 bästa är att det bara hämtar det tillstånd som faktiskt är nödvändigt!