Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да извлечете точно съвпадащи записи в Spring JPA @Query

Това не е толкова лесно, защото 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);

Най-хубавото е, че ще извлече само състоянието, което всъщност е необходимо!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Грешка Delphi XE5 FireDAC:Не може да се зареди библиотеката на доставчик [libmysql.dll или libmysqld.dll]

  2. MySQL външни ключове върху себе си

  3. Срив на MySQL при стартиране

  4. Как да комбинирате две SQL заявки с различни клаузи ORDER BY

  5. Дата на изтичане като стойност по подразбиране за колона TIMESTAMP