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