wake-up-neo.net

Benutzerdefiniertes Objekt aus Spring Data mit Native Query zurückgeben

Meine Frage basiert auf einem anderen Beitrag . Wie kann ich dasselbe mit einer nativen Abfrage erreichen? Native Abfragen erlauben kein JPQL, also auch keine neuen Instanzen.

Mein POJO.

class Coordinates {

    private final BigDecimal latitude
    private final BigDecimal longitude

    ...
}

Meine Datenbanktabelle enthält Koordinaten für den Umkreis der Städte. Es gibt also drei Spalten: Stadtname, Breitengrad und Längengrad. Jede Stadt enthält viele (eigentlich LOTS) Umkreiskoordinaten, die zum Erstellen eines Schattenbereichs in Google Maps verwendet werden.

Ich beabsichtige, eine einfache native Abfrage für diese Tabelle zu erstellen, die eine Liste von Koordinaten zurückgeben soll. 

7

Die Antwort fand ich unter einem anderen Beitrag . Grundsätzlich habe ich SqlResultSetMapping zusammen mit ConstructorResult (auf keine andere Weise geklappt) verwendet, mit besonderem Augenmerk auf einen Kommentar zu der akzeptierten Antwort des genannten Beitrags: Sie müssen die @NamedNativeQuery-Anmerkung zur Entität der verwendeten interface_ und _ hinzufügen. Dem Namen der Entität einen . voranstellen, sonst funktioniert es nicht.

Beispiel:

@Entity
@Table(name = "grupo_setorial")
@SqlResultSetMapping(
        name = "mapeamentoDeQuadrantes",
        classes = {
                @ConstructorResult(
                        targetClass = Coordenada.class,
                        columns = {
                                @ColumnResult(name = "latitude"),
                                @ColumnResult(name = "longitude")
                        }
                )
        }
)
@NamedNativeQuery(
        name = "GrupoCensitario.obterPerimetroDosSetores",
        query = "SELECT latitude as latitude, longitude as longitude FROM coordenadas where id_setor IN (:setores)",
        resultSetMapping = "mapeamentoDeQuadrantes"
)
public class GrupoCensitario {
11

Dies ist https://jira.spring.io/browse/DATAJPA-980 und Hier ist ein Projekt, das das Problem veranschaulicht.

@Query(value = "SELECT name AS name, age AS age FROM Person", nativeQuery = true)
List<PersonSummary> findAllProjectedNativeQuery();

Sie wurde in der Spring Data JPA 2.0 GA (Kay) -Datei, die mit Hibernate 5.2.11 geliefert wird, behoben. 

Das Problem wurde auch für Spring Data 1.10.12 (Ingalls) und 1.11.8 (Hopper) behoben, muss jedoch auf Hibernate 5.2.11 ausgeführt werden, um zu funktionieren.

2
ltsallas

Sie müssen sql result set mapping verwenden, das Teil von JPA ist.

2
johncena

Wenn Sie eine aktuelle Version von spring-data verwenden und auch die Repositories verwenden, denke ich persönlich, dass die Antwort von Itsallas zur richtigen Lösung führt.

Ich habe jetzt eigentlich nicht über (Spring Data) Projections gesprochen und brauchte einen Moment, um zu verstehen, was er in seinem Beispiel zeigte.

Deshalb möchte ich nur einen Link zum Spring Data JPA - Reference Documentation hinzufügen, siehe das Projektionskapitel .

Abfragemethoden von Spring Data geben in der Regel eine oder mehrere Instanzen des Aggregatstamms zurück, der vom Repository verwaltet wird. Es kann jedoch manchmal wünschenswert sein, Projektionen basierend auf bestimmten Attributen dieser Typen zu erstellen. Spring Data ermöglicht die Modellierung dedizierter Rückgabetypen, um Teilansichten der verwalteten Aggregate gezielter abzurufen.

0
morecore

Die Antwort fand ich:

public interface UserEventRepository extends JpaRepository<UserEvent, Long> {

    List<UserEvent> findAllByUserId(Long userId);

    @Query(value = "SELECT user_id FROM user_event ue " +
                   "WHERE ue.user_id = :userId", nativeQuery = true)
    List<Long> findUserIdByEventId(@Param("userId") Long userId);
}

Auf diese Weise geben wir List of Long - list of ids zurück. Der Schlüssel hier ist, dass wir die nativeQuery-Eigenschaft auf true setzen. Der Wert selbst ist die Abfrage, die ausgeführt werden soll.

Ich hoffe das hilft. Es scheint eine klare Lösung zu sein.

0
Reneta