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

Spring Data JPA Tutorial:Einführung in Abfragemethoden

Zuvor haben wir unser erstes Spring Data JPA-Repository erstellt, das CRUD-Operationen für Aufgabeneinträge bereitstellt.

Das ist zwar ein guter Anfang, hilft uns aber nicht beim Schreiben realer Anwendungen, da wir keine Ahnung haben, wie wir mithilfe benutzerdefinierter Suchkriterien Informationen aus der Datenbank abfragen können.

Eine Möglichkeit, Informationen aus der Datenbank zu finden, ist die Verwendung von Abfragemethoden. Bevor wir jedoch benutzerdefinierte Datenbankabfragen mit Abfragemethoden erstellen können, müssen wir die Antworten auf die folgenden Fragen finden:

  • Was sind Abfragemethoden?
  • Welche Art von Rückgabewerten können wir verwenden?
  • Wie können wir Parameter an unsere Abfragemethoden übergeben?

Auf all diese Fragen gibt dieser Blogbeitrag Antworten. Beginnen wir damit, die Antwort auf die erste Frage herauszufinden.

Eine sehr kurze Einführung in Abfragemethoden

Abfragemethoden sind Methoden, die Informationen aus der Datenbank finden und auf der Repository-Schnittstelle deklariert werden. Wenn wir beispielsweise eine Datenbankabfrage erstellen möchten, die die Todo findet Objekt, das eine bestimmte ID hat, können wir die Abfragemethode erstellen, indem wir findById() hinzufügen -Methode in das TodoRepository Schnittstelle. Nachdem wir dies getan haben, sieht unsere Repository-Oberfläche wie folgt aus:

import org.springframework.data.repository.Repository;

interface TodoRepository extends Repository<Todo, Long> { 

	//This is a query method.
	Todo findById(Long id);
}

Lassen Sie uns weitermachen und herausfinden, welche Art von Werten wir von unseren Abfragemethoden zurückgeben können.

Rückgabewerte von Abfragemethoden

Eine Abfragemethode kann nur ein Ergebnis oder mehr als ein Ergebnis zurückgeben. Außerdem können wir eine Abfragemethode erstellen, die asynchron aufgerufen wird. Dieser Abschnitt behandelt jede dieser Situationen und beschreibt, welche Art von Rückgabewerten wir in jeder Situation verwenden können.

Zuerst , wenn wir eine Abfrage schreiben, die nur ein Ergebnis zurückgeben soll, können wir die folgenden Typen zurückgeben:

  • Basistyp . Unsere Abfragemethode gibt den gefundenen Basistyp oder null zurück .
  • Entität . Unsere Abfragemethode gibt ein Entitätsobjekt oder null zurück .
  • Guava / Java 8 Optional . Unsere Abfragemethode gibt ein Optional zurück das das gefundene Objekt enthält oder ein leeres Optional .

Hier sind einige Beispiele für Abfragemethoden, die nur ein Ergebnis zurückgeben:

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

interface TodoRepository extends Repository<Todo, Long> { 

	@Query("SELECT t.title FROM Todo t where t.id = :id") 
	String findTitleById(@Param("id") Long id);
	
	@Query("SELECT t.title FROM Todo t where t.id = :id") 
	Optional<String> findTitleById(@Param("id") Long id);

	Todo findById(Long id);
	
	Optional<Todo> findById(Long id);
}

Zweiter , wenn wir eine Abfragemethode schreiben, die mehr als ein Ergebnis zurückgeben soll, können wir die folgenden Typen zurückgeben:

  • Liste . Unsere Abfragemethode gibt eine Liste mit den Abfrageergebnissen oder eine leere Liste zurück.
  • Streamen . Unsere Abfragemethode gibt einen Stream zurück die verwendet werden kann, um auf die Abfrageergebnisse oder einen leeren Stream zuzugreifen .

Hier sind einige Beispiele für Abfragemethoden, die mehr als ein Ergebnis zurückgeben:

import java.util.stream.Stream;
import org.springframework.data.repository.Repository;

interface TodoRepository extends Repository<Todo, Long> { 

	List<Todo> findByTitle(String title);
	
	Stream<Todo> findByTitle(String title);
}

Dritter , wenn wir wollen, dass unsere Abfragemethode asynchron ausgeführt wird, müssen wir sie mit @Async annotieren Anmerkung und geben Sie ein Future zurück Objekt. Hier sind einige Beispiele für Abfragemethoden, die asynchron ausgeführt werden:

import java.util.concurrent.Future;
import java.util.stream.Stream;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.Repository;
import org.springframework.data.repository.query.Param;
import org.springframework.scheduling.annotation.Async;

interface TodoRepository extends Repository<Todo, Long> { 

	@Async
	@Query("SELECT t.title FROM Todo t where t.id = :id") 
	Future<String> findTitleById(@Param("id") Long id);
	
	@Async
	@Query("SELECT t.title FROM Todo t where t.id = :id") 
	Future<Optional<String>> findTitleById(@Param("id") Long id);

	@Async
	Future<Todo> findById(Long id);
	
	@Async
	Future<Optional<Todo>> findById(Long id);

	@Async
	Future<List<Todo>> findByTitle(String title);
	
	@Async
	Future<Stream<Todo>> findByTitle(String title);
}

Lassen Sie uns weitermachen und herausfinden, wie wir Methodenparameter an unsere Abfragemethoden übergeben können.

Methodenparameter an Abfragemethoden übergeben

Wir können Parameter an unsere Datenbankabfragen übergeben, indem wir Methodenparameter an unsere Abfragemethoden übergeben. Spring Data JPA unterstützt sowohl die positionsbasierte Parameterbindung als auch benannte Parameter. Beide Möglichkeiten werden im Folgenden beschrieben.

Die positionsbasierte Parameterbindung bedeutet, dass die Reihenfolge unserer Methodenparameter entscheidet, welche Platzhalter durch sie ersetzt werden. Mit anderen Worten, der erste Platzhalter wird durch den ersten Methodenparameter ersetzt, der zweite Platzhalter wird durch den zweiten Methodenparameter ersetzt und so weiter.

Hier sind einige Abfragemethoden, die die positionsbasierte Parameterbindung verwenden:

import java.util.Optional
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.Repository;


interface TodoRepository extends Repository<Todo, Long> { 

	public Optional<Todo> findByTitleAndDescription(String title, String description);
	
	@Query("SELECT t FROM Todo t where t.title = ?1 AND t.description = ?2")
	public Optional<Todo> findByTitleAndDescription(String title, String description);
	
	@Query(value = "SELECT * FROM todos t where t.title = ?0 AND t.description = ?1", 
		nativeQuery=true
	)
	public Optional<Todo> findByTitleAndDescription(String title, String description);
}

Die Verwendung von positionsbasierter Parameterbindung ist etwas fehleranfällig, da wir die Reihenfolge der Methodenparameter oder die Reihenfolge der Platzhalter nicht ändern können, ohne unsere Datenbankabfrage zu unterbrechen. Wir können dieses Problem lösen, indem wir benannte Parameter verwenden.

Wir können benannte Parameter verwenden, indem wir die in unseren Datenbankabfragen gefundenen numerischen Platzhalter durch konkrete Parameternamen ersetzen und unsere Methodenparameter mit @Param kommentieren Anmerkung.

Hier sind einige Abfragemethoden, die benannte Parameter verwenden:

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


interface TodoRepository extends Repository<Todo, Long> { 
	
	@Query("SELECT t FROM Todo t where t.title = :title AND t.description = :description")
	public Optional<Todo> findByTitleAndDescription(@Param("title") String title, 
													@Param("description") String description);
	
	@Query(
		value = "SELECT * FROM todos t where t.title = :title AND t.description = :description", 
		nativeQuery=true
	)
	public Optional<Todo> findByTitleAndDescription(@Param("title") String title, 
													@Param("description") String description);
}

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

Zusammenfassung

Dieser Blogbeitrag hat uns drei Dinge gelehrt:

  • Abfragemethoden sind Methoden, die Informationen aus der Datenbank finden und auf der Repository-Schnittstelle deklariert werden.
  • Spring Data bietet eine ziemlich vielseitige Unterstützung für verschiedene Rückgabewerte, die wir nutzen können, wenn wir Abfragemethoden zu unseren Spring Data JPA-Repositorys hinzufügen.
  • Wir können Parameter an unsere Datenbankabfragen übergeben, indem wir entweder positionsbasierte Parameterbindungen oder benannte Parameter verwenden.

Der nächste Teil meines Spring Data JPA-Tutorials beschreibt, wie wir Datenbankabfragen aus den Methodennamen unserer Abfragemethoden erstellen können.

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


Java-Tag