Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Cara mengambil catatan yang cocok persis di Spring JPA @Query

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!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Memulihkan pengguna dan kata sandi 'root' yang dihapus untuk MySQL

  2. Migrasi Langsung Menggunakan Replikasi MySQL

  3. Konsumen produsen MySQL dengan beberapa utas pilihan

  4. MySQL; Tipe data terbaik untuk jumlah besar

  5. Jumlahkan total beberapa kolom MySQL yang disimpan di kolom lain?