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.
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 interface
ET 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 {
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.
Vous devrez utiliser sql result set mapping qui fait partie de JPA.
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.