Nie jest to takie proste, ponieważ Hibernate/JPA starają się zagwarantować, że model jednostki jest zsynchronizowany ze stanem bazy danych. Najwyraźniej chcesz projekcji, która najprawdopodobniej nie powinna być zsynchronizowana z bazą danych. Jeśli naprawdę musisz to zrobić, możesz użyć następującego zapytania, ale uważaj, że może to spowodować usunięcie elementów usługi w kolekcji, które nie spełniają kryteriów:
@Query(value = "SELECT DISTINCT req FROM request req JOIN FETCH req.services srvs WHERE (srvs.status = :serviceStatus)")
List<Request> getAll(@Param("serviceStatus") String serviceStatus);
Zwykle jest to obsługiwane przez wprowadzenie DTO i myślę, że jest to idealny przypadek użycia dla Wyświetlenia jednostek Blaze-Persistence .
Stworzyłem bibliotekę, aby umożliwić łatwe mapowanie między modelami JPA a niestandardowym interfejsem lub modelami zdefiniowanymi w klasie abstrakcyjnej, coś w rodzaju Spring Data Projections na sterydach. Chodzi o to, aby zdefiniować strukturę docelową (model domeny) tak, jak lubisz i mapować atrybuty (gettery) za pomocą wyrażeń JPQL do modelu encji.
Model DTO dla twojego przypadku użycia może wyglądać następująco z 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();
}
}
Zapytania to kwestia zastosowania widoku encji do zapytania, najprostsze to po prostu zapytanie według identyfikatora.
RequestDto a = entityViewManager.find(entityManager, RequestDto.class, id);
Integracja Spring Data umożliwia korzystanie z niej prawie tak, jak z 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);
Najlepsze jest to, że pobierze tylko stan, który jest rzeczywiście niezbędny!