TL;DR
Durch Angabe von "nativeQuery = true" für "@ Query" von Spring Data JPA können Sie nach SQL anstelle von JPQL abfragen.
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
In Spring Data JPA können Sie Repository als DAO verwenden, dh ein Objekt, das auf Tabellen zugreifen kann, indem Sie einfach eine Methode in der Repository-Schnittstelle und DI mit + @ Autowired
definieren.
PhotoRepository.java
@Repository
public interface PhotoRepository extends JpaRepository<Photo, Integer> {
//PHOTO Tabelle ist USER_Wenn Sie eine ID-Spalte haben, die Argumente userId und USER_Erhalten Sie Datensätze mit übereinstimmender ID
Iterator<Photo> findByUserId(int userId);
}
PhotoService.java
@Service
public class PhotoService {
@Autowired // DI:Instantiiert
private PhotoRepository repository;
public Iterator<Photo> getPhotos(int userId) {
return repository.findByUserId(userId);
}
}
(Der Einfachheit halber verwenden wir das Repository, das JpaRepository direkt erbt. Tatsächlich ist die Definition der JpaRepository-Vererbung / Entität von der Domänenebene getrennt, in der PhotoRepository platziert ist.)
@ Repository
gibt an, dass es sich im Frühjahr um eine Repository-Komponente handelt, und diese Anmerkung unterliegt der DI von @ Autowired
.
Im Folgenden finden Sie übrigens die Namenskonventionen für Methoden, die im Repository definiert werden können. Sie können auch normalerweise "ZWISCHEN" oder "ORDER_BY" ausführen. Spring Data JPA - Reference Documentation
@Query
Wenn Sie einer Methode im Repository "@ Query" hinzufügen, können Sie die Abfrage direkt als Zeichenfolge definieren, ohne die Abfrage anhand der Methodennamenskonvention zu definieren.
public interface PhotoRepository extends JpaRepository<Photo, Integer> {
@Query(value = "select p from photo p where p.userId = 1") // JPQL
Iterator<Photo> findPhotosByUserId(int userId);
}
Die Abfragesprache JPQL kann jedoch standardmäßig definiert werden, nicht SQL. Wenn Sie SQL also normal in das Argument "@ Query" schreiben, tritt daher ein Fehler auf.
Referenz: 10.2. JPQL-Sprachreferenz
Fügen Sie zur Ausführung mit SQL "nativeQuery = true" hinzu, wie am Anfang gezeigt. Jetzt können Sie SQL wie gewohnt verwenden.
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