Това не е толкова лесно, защото Hibernate/JPA се опитват да гарантират, че моделът на обекта е в синхрон със състоянието на базата данни. Очевидно искате проекция, която най-вероятно не трябва да се поддържа в синхрон с базата данни. Ако наистина трябва да направите това, можете да използвате следната заявка, но внимавайте, че това може да доведе до изтриване на служебни елементи в колекцията, които не отговарят на критериите:
@Query(value = "SELECT DISTINCT req FROM request req JOIN FETCH req.services srvs WHERE (srvs.status = :serviceStatus)")
List<Request> getAll(@Param("serviceStatus") String serviceStatus);
Това обикновено се решава чрез въвеждане на DTO и мисля, че това е идеалният случай на използване за Изгледи на Blaze-Psistence Entity .
Създадох библиотеката, за да позволя лесно картографиране между JPA модели и персонализиран интерфейс или модели, дефинирани от абстрактни класове, нещо като Spring Data Projections върху стероиди. Идеята е да дефинирате вашата целева структура (модел на домейн) по начина, по който искате, и да съпоставите атрибути (гетери) чрез JPQL изрази към модела на обекта.
Модел на DTO за вашия случай на употреба може да изглежда по следния начин с 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();
}
}
Запитването е въпрос на прилагане на изглед на обект към заявка, като най-простата е просто заявка по идентификатор.
RequestDto a = entityViewManager.find(entityManager, RequestDto.class, id);
Интеграцията на Spring Data ви позволява да го използвате почти като 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);
Най-хубавото е, че ще извлече само състоянието, което всъщност е необходимо!