Dat is niet zo eenvoudig omdat Hibernate/JPA proberen te garanderen dat het entiteitsmodel synchroon loopt met de databasestatus. U wilt blijkbaar een projectie die hoogstwaarschijnlijk niet synchroon moet worden gehouden met de database. Als je dit echt moet doen, kun je de volgende query gebruiken, maar pas op dat dit kan leiden tot verwijdering van service-elementen in de verzameling die niet voldoen aan de criteria:
@Query(value = "SELECT DISTINCT req FROM request req JOIN FETCH req.services srvs WHERE (srvs.status = :serviceStatus)")
List<Request> getAll(@Param("serviceStatus") String serviceStatus);
Dit wordt meestal afgehandeld door DTO's te introduceren en ik denk dat dit een perfecte use case is voor Blaze-Persistence Entiteitsweergaven .
Ik heb de bibliotheek gemaakt om gemakkelijk in kaart te brengen tussen JPA-modellen en aangepaste interface of abstracte klasse-gedefinieerde modellen, zoiets als Spring Data Projections op steroïden. Het idee is dat u uw doelstructuur (domeinmodel) definieert zoals u dat wilt en attributen (getters) via JPQL-expressies toewijst aan het entiteitsmodel.
Een DTO-model voor uw gebruiksscenario kan er met Blaze-Persistence Entity-Views als volgt uitzien:
@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();
}
}
Query's uitvoeren is een kwestie van het toepassen van de entiteitsweergave op een query, waarbij de eenvoudigste gewoon een query op id is.
RequestDto a = entityViewManager.find(entityManager, RequestDto.class, id);
Dankzij de Spring Data-integratie kun je het bijna gebruiken zoals 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);
Het beste is dat het alleen de status haalt die echt nodig is!