Java >> Java Tutorial >  >> Tag >> Spring

Spring Data JPA Tutorial:Erstellen von Datenbankabfragen mit der @Query-Annotation

Im vorherigen Teil dieses Tutorials wurde beschrieben, wie wir Datenbankabfragen aus den Methodennamen unserer Abfragemethoden erstellen können.

Obwohl diese Strategie ihre Vorteile hat, hat sie auch ihre Schwächen. Dieser Blogbeitrag beschreibt, wie wir diese Schwächen durch die Verwendung von @Query vermeiden können Anmerkung.

Wir werden auch eine einfache Suchfunktion implementieren, die zwei Anforderungen hat:

  • Es muss Aufgabeneinträge zurückgeben, deren Titel oder Beschreibung den angegebenen Suchbegriff enthält.
  • Bei der Suche muss die Groß-/Kleinschreibung beachtet werden.

Fangen wir an.

Erstellen von Abfragemethoden

Wir können die aufgerufene Datenbankabfrage konfigurieren, indem wir die Abfragemethode mit @Query kommentieren Anmerkung. Es unterstützt sowohl JPQL- als auch SQL-Abfragen und die Abfrage, die mit @Query angegeben wird Annotation geht allen anderen Abfragegenerierungsstrategien voraus.

Mit anderen Worten, wenn wir eine Abfragemethode namens findbyId() erstellen und kommentieren Sie es mit @Query Anmerkung, Spring Data JPA findet (notwendigerweise) nicht die Entität, deren id Die Eigenschaft ist gleich dem angegebenen Methodenparameter. Es ruft die Abfrage auf, die mithilfe von @Query konfiguriert wird Anmerkung.

Beispiel:

Nehmen wir an, dass unsere Repository-Schnittstelle wie folgt aussieht:

import org.springframework.data.repository.Repository;
 
import java.util.Optional;
 
interface TodoRepository extends Repository<Todo, Long> {
 
 	@Query("SELECT t FROM Todo t WHERE t.title = 'title'")
	public List<Todo> findById();
}

Obwohl die findById() -Methode folgt der Namenskonvention, die verwendet wird, um Datenbankabfragen aus dem Methodennamen der Abfragemethode, der findById(), zu erstellen -Methode gibt Todo-Einträge zurück, deren Titel 'title' ist, da dies die Abfrage ist, die durch die Verwendung von @Query angegeben wird Anmerkung.

Lassen Sie uns herausfinden, wie wir mit @Query sowohl JPQL- als auch SQL-Abfragen erstellen können Anmerkung.

JPQL-Abfragen erstellen

Wir können eine JPQL-Abfrage mit der Annotation @Query erstellen, indem wir diesen Schritten folgen:

  1. Fügen Sie eine Abfragemethode zu unserer Repository-Schnittstelle hinzu.
  2. Kommentieren Sie die Abfragemethode mit @Query -Anmerkung und geben Sie die aufgerufene Abfrage an, indem Sie sie als Wert von @Query festlegen Anmerkung.

Der Quellcode unserer Repository-Schnittstelle sieht wie folgt aus:

import org.springframework.data.repository.Repository;
 
import java.util.Optional;
 
interface TodoRepository extends Repository<Todo, Long> {
 
 	@Query("SELECT t FROM Todo t WHERE t.title = 'title'")
	public List<Todo> findByTitle();
}

Erstellen von SQL-Abfragen

Wir können eine SQL-Abfrage mit @Query erstellen Anmerkung, indem Sie diesen Schritten folgen:

  1. Fügen Sie eine Abfragemethode zu unserer Repository-Schnittstelle hinzu.
  2. Kommentieren Sie die Abfragemethode mit @Query -Anmerkung und geben Sie die aufgerufene Abfrage an, indem Sie sie als Wert von @Query festlegen Wert der Anmerkung Attribut.
  3. Legen Sie den Wert von @Query fest nativeQuery der Annotation Attribut zu wahr .

Der Quellcode unserer Repository-Schnittstelle sieht wie folgt aus:

import org.springframework.data.repository.Repository;
 
import java.util.Optional;
 
interface TodoRepository extends Repository<Todo, Long> {
 
 	@Query(value = "SELECT * FROM todos t WHERE t.title = 'title'",
			nativeQuery=true
	)
	public List<Todo> findByTitle();
}

Lassen Sie uns weitermachen und herausfinden, wie wir eine Abfragemethode erstellen können, die die Anforderungen unserer Suchfunktion erfüllt.

Implementieren der Suchfunktion

Dieser Abschnitt beschreibt, wie wir eine Suchfunktion ohne Berücksichtigung der Groß-/Kleinschreibung implementieren können, die alle Aufgabeneinträge zurückgibt, deren Titel oder Beschreibung den angegebenen Suchbegriff enthält.

Implementieren der Suchfunktion mit JPQL

Wir können die JPQL-Abfrage erstellen, die die Anforderungen unserer Suchfunktion erfüllt, indem wir diesen Schritten folgen:

  1. Erstellen Sie eine Abfragemethode, die eine Liste von Todo zurückgibt Objekte.
  2. Kommentieren Sie die Methode mit @Query Anmerkung.
  3. Erstellen Sie die JPQL-Abfrage, die benannte Parameter verwendet und Aufgabeneinträge zurückgibt, deren Titel oder Beschreibung den angegebenen Suchbegriff enthält (denken Sie daran, Groß- und Kleinschreibung zu ignorieren). Legen Sie die erstellte Abfrage als Wert von @Query fest Anmerkung.
  4. Fügen Sie der Abfragemethode einen Methodenparameter hinzu und konfigurieren Sie den Namen des benannten Parameters, indem Sie den Methodenparameter mit @Param kommentieren Anmerkung.

Der Quellcode unserer Repository-Schnittstelle sieht wie folgt aus:

import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.Repository;
import org.springframework.data.repository.query.Param;

import java.util.List;

interface TodoRepository extends Repository<Todo, Long> {

    @Query("SELECT t FROM Todo t WHERE " +
            "LOWER(t.title) LIKE LOWER(CONCAT('%',:searchTerm, '%')) OR " +
            "LOWER(t.description) LIKE LOWER(CONCAT('%',:searchTerm, '%'))")
    List<Todo> findBySearchTerm(@Param("searchTerm") String searchTerm);
}

Lassen Sie uns herausfinden, wie wir unsere Suchfunktion mithilfe von SQL implementieren können.

Implementieren der Suchfunktion mit SQL

Wir können die SQL-Abfrage erstellen, die die Anforderungen unserer Suchfunktion erfüllt, indem Sie diesen Schritten folgen:

  1. Erstellen Sie eine Abfragemethode, die eine Liste von Todo zurückgibt Objekte.
  2. Kommentieren Sie die Methode mit @Query Anmerkung.
  3. Erstellen Sie die aufgerufene SQL-Abfrage, indem Sie diesen Schritten folgen:
    1. Erstellen Sie die SQL-Abfrage, die benannte Parameter verwendet und Aufgabeneinträge zurückgibt, deren Titel oder Beschreibung den angegebenen Suchbegriff enthält (denken Sie daran, Groß- und Kleinschreibung zu ignorieren). Legen Sie die erstellte Abfrage als Wert von @Query fest Wert der Anmerkung Attribut.
    2. Legen Sie den Wert von @Query fest nativeQuery der Annotation Attribut auf true .
  4. Fügen Sie der Abfragemethode einen Methodenparameter hinzu und konfigurieren Sie den Namen des benannten Parameters, indem Sie den Methodenparameter mit @Param kommentieren Anmerkung.

Der Quellcode unserer Repository-Schnittstelle sieht wie folgt aus:

import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.Repository;
import org.springframework.data.repository.query.Param;

import java.util.List;

interface TodoRepository extends Repository<Todo, Long> {

    @Query(value = "SELECT * FROM todos t WHERE " +
            "LOWER(t.title) LIKE LOWER(CONCAT('%',:searchTerm, '%')) OR " +
            "LOWER(t.description) LIKE LOWER(CONCAT('%',:searchTerm, '%'))",
            nativeQuery = true
    )
    List<Todo> findBySearchTermNative(@Param("searchTerm") String searchTerm);
}

Lassen Sie uns weitermachen und herausfinden, wann wir unsere Datenbankabfragen mit @Query erstellen sollten Anmerkung.

Wann sollten wir die @Query-Anmerkung verwenden?

Die @Abfrage Anmerkungen haben die folgenden Vorteile:

  • Es unterstützt sowohl JPQL als auch SQL.
  • Die aufgerufene Abfrage befindet sich über der Abfragemethode. Mit anderen Worten, es ist einfach herauszufinden, was die Abfragemethode tut.
  • Es gibt keine Namenskonvention für Abfragemethodennamen.

Die @Abfrage Annotation hat die folgenden Nachteile:

  • Es gibt keine Unterstützung für dynamische Abfragen.
  • Wenn wir SQL-Abfragen verwenden, können wir die verwendete Datenbank nicht ändern, ohne zu testen, ob unsere SQL-Abfragen wie erwartet funktionieren.

Wenn wir über die Vor- und Nachteile der @Query nachdenken Annotation wird deutlich, dass die Abfragemethoden, die diese Strategie verwenden, nicht so einfach zu schreiben oder zu lesen sind wie die Abfragemethoden, die die Abfragegenerierung aus der Methodennamenstrategie verwenden.

Diese Abfragemethoden haben jedoch zwei entscheidende Vorteile:

  1. Wenn wir herausfinden müssen, welche Datenbankabfrage von unserer Abfragemethode aufgerufen wird, können wir die aufgerufene Abfrage über der Abfragemethode finden.
  2. Der Code, der unsere Abfragemethoden verwendet, ist einfach zu lesen, da wir keine langen Methodennamen verwenden müssen.

Wenn wir also die Abfragegenerierung aus der Methodennamenstrategie nicht verwenden möchten, weil die Namen unserer Abfragemethoden zu lang wären, sollten wir die @Query verwenden Anmerkung.

Fahren wir fort und fassen zusammen, was wir aus diesem Blogpost gelernt haben.

Zusammenfassung

Dieser Blogbeitrag hat uns drei Dinge gelehrt:

  • Die mit @Query angegebenen Datenbankabfragen Annotation geht allen anderen Abfragegenerierungsstrategien voraus.
  • Die @Abfrage Annotation unterstützt sowohl JPQL- als auch SQL-Abfragen.
  • Wenn wir unsere Datenbankabfragen nicht aus den Methodennamen unserer Abfragemethoden erstellen können, weil die Methodennamen zu lang wären, sollten wir sie mit @Query erstellen Anmerkung.

Der nächste Teil meines Spring Data JPA-Tutorials beschreibt, wie wir Datenbankabfragen erstellen können, indem wir benannte Abfragen verwenden.

P.S. Sie können die Beispielanwendung dieses Blogbeitrags von Github herunterladen.


Java-Tag