Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak pobrać dokładnie pasujące rekordy w Spring JPA @Query

Nie jest to takie proste, ponieważ Hibernate/JPA starają się zagwarantować, że model jednostki jest zsynchronizowany ze stanem bazy danych. Najwyraźniej chcesz projekcji, która najprawdopodobniej nie powinna być zsynchronizowana z bazą danych. Jeśli naprawdę musisz to zrobić, możesz użyć następującego zapytania, ale uważaj, że może to spowodować usunięcie elementów usługi w kolekcji, które nie spełniają kryteriów:

@Query(value = "SELECT DISTINCT req FROM request req JOIN FETCH req.services srvs WHERE (srvs.status = :serviceStatus)")
List<Request> getAll(@Param("serviceStatus") String serviceStatus);

Zwykle jest to obsługiwane przez wprowadzenie DTO i myślę, że jest to idealny przypadek użycia dla Wyświetlenia jednostek Blaze-Persistence .

Stworzyłem bibliotekę, aby umożliwić łatwe mapowanie między modelami JPA a niestandardowym interfejsem lub modelami zdefiniowanymi w klasie abstrakcyjnej, coś w rodzaju Spring Data Projections na sterydach. Chodzi o to, aby zdefiniować strukturę docelową (model domeny) tak, jak lubisz i mapować atrybuty (gettery) za pomocą wyrażeń JPQL do modelu encji.

Model DTO dla twojego przypadku użycia może wyglądać następująco z 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();
    }
}

Zapytania to kwestia zastosowania widoku encji do zapytania, najprostsze to po prostu zapytanie według identyfikatora.

RequestDto a = entityViewManager.find(entityManager, RequestDto.class, id);

Integracja Spring Data umożliwia korzystanie z niej prawie tak, jak z 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);

Najlepsze jest to, że pobierze tylko stan, który jest rzeczywiście niezbędny!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak stworzyć bazę danych MySQL i ustawić uprawnienia

  2. MySQL C++ Connector:niezdefiniowane odniesienie do `get_driver_instance'

  3. Czat na żywo z PHP i jQuery. Gdzie przechowywać informacje? MySQL czy plik?

  4. Jak znaleźć określone wartości szesnastkowe i wartości Char() w SELECT w MySQL?

  5. Jak sprawić, by MySQL używał INDEXu do zapytań o widok?