web-dev-qa-db-fra.com

Renvoyer un objet personnalisé à partir des données de printemps avec une requête native

Ma question est basée sur un autre post . Comment puis-je obtenir la même chose avec une requête native? Les requêtes natives n'autorisent pas JPQL et n'autorisent donc pas non plus les nouvelles instances.

Mon POJO.

class Coordinates {

    private final BigDecimal latitude
    private final BigDecimal longitude

    ...
}

Ma table de base de données contient les coordonnées du périmètre des villes. Il y a donc trois colonnes: nom de la ville, latitude, longitude. Chaque ville contient de nombreuses coordonnées de périmètre qui seront utilisées pour créer une zone d'ombre dans Google Maps.

J'ai l'intention de créer une requête native simple sur cette table, qui devrait renvoyer une liste de coordonnées. 

7
Sidney de Moraes

Trouvé la réponse sur un autre post . En gros, j’ai utilisé SqlResultSetMapping avec ConstructorResult (aucune autre solution n’a été trouvée) en portant une attention particulière à un commentaire sur la réponse acceptée du message mentionné: vous devez ajouter l’annotation @NamedNativeQuery à l’entité de la interfaceET préfixez le nom de l'entité avec un . sinon cela ne fonctionnera pas.

Exemple:

@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
Sidney de Moraes

Ceci est https://jira.spring.io/browse/DATAJPA-980 et Ici est un projet qui illustre le problème.

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

Il est corrigé dans la version Spring Data JPA 2.0 GA (Kay) fournie avec Hibernate 5.2.11. 

Le problème est également résolu pour Spring Data 1.10.12 (Ingalls) et 1.11.8 (Hopper), mais il devra être exécuté sur Hibernate 5.2.11 pour fonctionner.

2
ltsallas

Vous devrez utiliser sql result set mapping qui fait partie de JPA.

2
johncena

Si vous utilisez une version récente de spring-data et utilisez également la Repositories, je pense personnellement que la réponse de Itsallas mène à la bonne solution.

En fait, je ne connaissais pas encore (Spring Data) Projections et j'avais besoin d'un instant pour comprendre ce qu'il montrait dans son exemple.

Par conséquent, je veux juste ajouter un lien au Spring Data JPA - Reference Documentation, jetez un coup d’œil au chapitre Projections .

Les méthodes de requête Spring Data renvoient généralement une ou plusieurs instances de la racine d'agrégat gérée par le référentiel. Cependant, il peut parfois être souhaitable de créer des projections basées sur certains attributs de ces types. Spring Data permet de modéliser des types de retour dédiés afin d’extraire de manière plus sélective des vues partielles des agrégats gérés.

0
morecore