Mysql
 sql >> Datenbank >  >> RDS >> Mysql

So rufen Sie exakt übereinstimmende Datensätze in Spring JPA @Query ab

Das ist nicht so einfach, weil Hibernate/JPA versuchen zu garantieren, dass das Entitätsmodell mit dem Datenbankstatus synchron ist. Offensichtlich möchten Sie eine Projektion, die höchstwahrscheinlich nicht mit der Datenbank synchronisiert werden sollte. Wenn Sie dies wirklich tun müssen, können Sie die folgende Abfrage verwenden, aber beachten Sie, dass dies zum Löschen von Dienstelementen in der Sammlung führen kann, die den Kriterien nicht entsprechen:

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

Dies wird normalerweise durch die Einführung von DTOs gehandhabt, und ich denke, dies ist ein perfekter Anwendungsfall für Ansichten von Blaze-Persistence-Entitäten .

Ich habe die Bibliothek erstellt, um eine einfache Zuordnung zwischen JPA-Modellen und benutzerdefinierten Schnittstellen oder abstrakten klassendefinierten Modellen zu ermöglichen, so etwas wie Spring Data Projections auf Steroiden. Die Idee ist, dass Sie Ihre Zielstruktur (Domänenmodell) so definieren, wie Sie möchten, und Attribute (Getter) über JPQL-Ausdrücke dem Entitätsmodell zuordnen.

Ein DTO-Modell für Ihren Anwendungsfall könnte mit Blaze-Persistence Entity-Views wie folgt aussehen:

@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();
    }
}

Bei der Abfrage geht es darum, die Entitätsansicht auf eine Abfrage anzuwenden, wobei die einfachste nur eine Abfrage nach ID ist.

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

Die Spring Data-Integration ermöglicht es Ihnen, es fast wie Spring Data Projections zu verwenden:https://persistence.blazebit.com/documentation/entity-view/manual/en_US/index.html#spring-data-features

List<RequestDto> findAll(@OptionalParam("serviceStatus") String serviceStatus);

Das Beste daran ist, dass nur der Zustand abgerufen wird, der tatsächlich benötigt wird!