Điều đó không dễ dàng như vậy vì Hibernate / JPA cố gắng đảm bảo rằng mô hình thực thể đồng bộ với trạng thái cơ sở dữ liệu. Bạn dường như muốn một phép chiếu mà hầu hết có lẽ không nên được giữ đồng bộ với cơ sở dữ liệu. Nếu bạn thực sự phải thực hiện việc này, bạn có thể sử dụng truy vấn sau, nhưng hãy lưu ý rằng điều này có thể gây ra việc xóa các phần tử dịch vụ trong bộ sưu tập không phù hợp với tiêu chí:
@Query(value = "SELECT DISTINCT req FROM request req JOIN FETCH req.services srvs WHERE (srvs.status = :serviceStatus)")
List<Request> getAll(@Param("serviceStatus") String serviceStatus);
Điều này thường được xử lý bằng cách giới thiệu DTO và tôi nghĩ đây là trường hợp sử dụng hoàn hảo cho Chế độ xem đối tượng Blaze-Persistence .
Tôi đã tạo thư viện để cho phép dễ dàng ánh xạ giữa các mô hình JPA và giao diện tùy chỉnh hoặc các mô hình được xác định theo lớp trừu tượng, giống như Dự báo dữ liệu mùa xuân trên steroid. Ý tưởng là bạn xác định cấu trúc mục tiêu của mình (mô hình miền) theo cách bạn thích và ánh xạ các thuộc tính (getters) thông qua các biểu thức JPQL với mô hình thực thể.
Mô hình DTO cho trường hợp sử dụng của bạn có thể giống như sau với 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();
}
}
Truy vấn là vấn đề áp dụng chế độ xem thực thể cho một truy vấn, đơn giản nhất chỉ là truy vấn theo id.
RequestDto a = entityViewManager.find(entityManager, RequestDto.class, id);
Tích hợp Dữ liệu mùa xuân cho phép bạn sử dụng nó gần giống như Phép chiếu dữ liệu mùa xuân: https://persistence.blazebit.com/documentation/entity-view/manual/en_US/index.html#spring-data-features
List<RequestDto> findAll(@OptionalParam("serviceStatus") String serviceStatus);
Phần tốt nhất là, nó sẽ chỉ tìm nạp trạng thái thực sự cần thiết!