[JAVA] Spring Data JPA: écrivez une requête en Pure SQL dans @Query of Repository

TL;DR

En spécifiant nativeQuery = true pour @ Query de Spring Data JPA, vous pouvez interroger par SQL au lieu de JPQL.

public interface PhotoRepository extends JpaRepository<Photo, Integer> {
  @Query(value = "SELECT * FROM PHOTO AS p WHERE p.USER_ID = 1", nativeQuery = true) // SQL
  Iterator<Photo> findPhotosByUserId(int userId);
}

@Repository

Dans Spring Data JPA, vous pouvez utiliser Repository comme DAO, c'est-à-dire un objet pouvant accéder aux tables, simplement en définissant une méthode dans l'interface Repository et DI avec + @ Autowired.

PhotoRepository.java


@Repository
public interface PhotoRepository extends JpaRepository<Photo, Integer> {
//La table PHOTO est USER_Si vous avez une colonne ID, les arguments userId et USER_Obtenez des enregistrements avec un ID correspondant
  Iterator<Photo> findByUserId(int userId); 
}

PhotoService.java


@Service
public class PhotoService {

  @Autowired // DI:Instancié
  private PhotoRepository repository;

  public Iterator<Photo> getPhotos(int userId) {
     return repository.findByUserId(userId);
  }

}

(Pour plus de simplicité, nous utilisons le référentiel qui hérite directement de JpaRepository. En fait, l'héritage JpaRepository / la définition d'entité est séparé de la couche de domaine où le PhotoRepository est placé.)

@ Repository indique qu'il s'agit d'un composant de référentiel dans Spring, et cette annotation le soumet à DI par @ Autowired.

À propos, voyez ci-dessous les conventions de dénomination des méthodes qui peuvent être définies dans Repository. Vous pouvez également faire BETWEEN ou ʻORDER_BY` normalement. Spring Data JPA - Reference Documentation

@Query

Si vous ajoutez @ Query à une méthode sur le référentiel, vous pouvez définir la requête directement comme une chaîne sans définir la requête à partir de la convention de dénomination de méthode.

public interface PhotoRepository extends JpaRepository<Photo, Integer> {
  @Query(value = "select p from photo p where p.userId = 1") // JPQL
  Iterator<Photo> findPhotosByUserId(int userId);
}

Cependant, le langage de requête appelé JPQL peut être défini par défaut, pas SQL. Par conséquent, si vous écrivez normalement SQL dans l'argument de @ Query, une erreur se produira.

Référence: 10.2. JPQL Language Reference

Pour exécuter avec SQL, ajoutez nativeQuery = true comme indiqué au début. Vous pouvez maintenant utiliser SQL comme d'habitude.

public interface PhotoRepository extends JpaRepository<Photo, Integer> {
  @Query(value = "SELECT * FROM PHOTO AS p WHERE p.USER_ID = 1", nativeQuery = true) // SQL
  Iterator<Photo> findPhotosByUserId(int userId);
}

Recommended Posts

Spring Data JPA: écrivez une requête en Pure SQL dans @Query of Repository
Création d'un référentiel commun avec Spring Data JPA
Vérifiez le comportement de getOne, findById et des méthodes de requête avec Spring Boot + Spring Data JPA
Sortie du journal Spring Data JPA SQL
[Spring Data JPA] L'ID personnalisé est attribué dans une séquence unique au moment de l'enregistrement.
Existe en utilisant la spécification dans Spring Data JPA
Pour écrire des données de réponse directement dans Spring
Aucune liste de propriétés trouvée pour le type car il s'agit d'une requête non nommée de Spring Data JPA
Exemple de code pour la recherche à l'aide de QBE (requête par exemple) de Spring Data JPA
Jusqu'à l'utilisation de Spring Data et JPA Part 2
Jusqu'à l'utilisation de Spring Data et JPA Part 1
Créer la variable de clause where dans Spring Data JPA
[Spring Data JPA] La condition And peut-elle être utilisée dans la méthode de suppression implémentée automatiquement?
Créez un environnement de test MySQL (+ des millions de données de test) en 5 minutes
[spring] Utilisons Spring Data JPA
Obtenez une instance proxy du composant lui-même dans Spring Boot
Voir le comportement des mises à jour d'entités avec Spring Boot + Spring Data JPA
Écrivons un code de test pour la fonction de connexion avec Spring Boot
Écrire du code de test avec Spring Boot
[Comment installer Spring Data Jpa]
[Rails] Je souhaite envoyer des données de différents modèles dans un formulaire