[JAVA] Spring Data JPA: Schreiben Sie eine Abfrage in Pure SQL in @Query of Repository

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

Spring Data JPA: Schreiben Sie eine Abfrage in Pure SQL in @Query of Repository
Erstellen eines gemeinsamen Repositorys mit Spring Data JPA
Überprüfen Sie das Verhalten von getOne-, findById- und Abfragemethoden mit Spring Boot + Spring Data JPA
Spring Data JPA SQL-Protokollausgabe
[Spring Data JPA] Die benutzerdefinierte ID wird zum Zeitpunkt der Registrierung in einer eindeutigen Reihenfolge zugewiesen.
Existiert mit der Spezifikation in Spring Data JPA
Antwortdaten direkt im Frühjahr schreiben
Für den Typ wurde keine Eigenschaftsliste gefunden, da es sich um eine nicht benannte Abfrage von Spring Data JPA handelt
Beispielcode für die Suche mit QBE (Query by Example) von Spring Data JPA
Bis zur Verwendung von Spring Data und JPA Part 2
Bis zur Verwendung von Spring Data und JPA Part 1
Machen Sie die where-Klauselvariable in Spring Data JPA
[Spring Data JPA] Kann die And-Bedingung in der automatisch implementierten Löschmethode verwendet werden?
Erstellen Sie in 5 Minuten eine MySQL-Testumgebung (+ Millionen von Testdaten)
[spring] Verwenden wir Spring Data JPA
Rufen Sie in Spring Boot eine Proxy-Instanz der Komponente selbst ab
Sehen Sie sich das Verhalten von Entitätsaktualisierungen mit Spring Boot + Spring Data JPA an
Schreiben wir einen Testcode für die Anmeldefunktion mit Spring Boot
Schreiben Sie den Testcode mit Spring Boot
[So installieren Sie Spring Data Jpa]
[Rails] Ich möchte Daten verschiedener Modelle in einem Formular senden