Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Cách tìm nạp các bản ghi đối sánh chính xác trong Spring JPA @Query

Đ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!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để lưu trữ GUID trong các bảng MySQL?

  2. Cách đối phó với độ dài dòng khổng lồ được tạo bởi mysqldump

  3. Làm thế nào để làm cho Django hoạt động với các trình điều khiển MySQL không được hỗ trợ chẳng hạn như trình điều khiển MySQL của gevent-mysql hoặc Concained?

  4. cố gắng lấy số tháng

  5. Duy trì dữ liệu không nguyên thủy trong JPA