Itu tidak mudah karena Hibernate/JPA mencoba menjamin bahwa model entitas sinkron dengan status basis data. Anda tampaknya menginginkan proyeksi yang kemungkinan besar tidak harus disinkronkan dengan database. Jika Anda benar-benar harus melakukannya, Anda dapat menggunakan kueri berikut, tetapi berhati-hatilah karena hal ini dapat menyebabkan penghapusan elemen layanan dalam koleksi yang tidak sesuai dengan kriteria:
@Query(value = "SELECT DISTINCT req FROM request req JOIN FETCH req.services srvs WHERE (srvs.status = :serviceStatus)")
List<Request> getAll(@Param("serviceStatus") String serviceStatus);
Ini biasanya ditangani dengan memperkenalkan DTO dan saya pikir ini adalah kasus penggunaan yang sempurna untuk Tampilan Entitas Blaze-Persistence .
Saya membuat perpustakaan untuk memungkinkan pemetaan yang mudah antara model JPA dan antarmuka khusus atau model yang ditentukan kelas abstrak, seperti Proyeksi Data Musim Semi pada steroid. Idenya adalah Anda mendefinisikan struktur target (model domain) sesuai keinginan Anda dan memetakan atribut (getter) melalui ekspresi JPQL ke model entitas.
Model DTO untuk kasus penggunaan Anda dapat terlihat seperti berikut dengan 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();
}
}
Membuat kueri adalah masalah menerapkan tampilan entitas ke kueri, yang paling sederhana hanyalah kueri dengan id.
RequestDto a = entityViewManager.find(entityManager, RequestDto.class, id);
Integrasi Data Musim Semi memungkinkan Anda untuk menggunakannya hampir seperti Proyeksi Data Musim Semi:https://persistence.blazebit.com/documentation/entity-view/manual/en_US/index.html#spring-data-features
List<RequestDto> findAll(@OptionalParam("serviceStatus") String serviceStatus);
Bagian terbaiknya adalah, itu hanya akan mengambil status yang benar-benar diperlukan!