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

Spring Data JPA Tutorial:Erstellen von Datenbankabfragen aus Methodennamen

Im vorherigen Teil dieses Tutorials haben wir gelernt, Methodenparameter an unsere Abfragemethoden zu übergeben, und beschrieben, welche Art von Werten wir von ihnen zurückgeben können.

Dieser Blogbeitrag beschreibt, wie wir Abfragemethoden erstellen können, indem wir die Abfragegenerierung aus der Methodennamenstrategie verwenden.

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

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

Fangen wir an.

Erstellen von Abfragemethoden

Die Abfragegenerierung aus dem Methodennamen ist eine Abfragegenerierungsstrategie, bei der die aufgerufene Abfrage vom Namen der Abfragemethode abgeleitet wird.

Wir können Abfragemethoden erstellen, die diese Strategie verwenden, indem wir diese Regeln befolgen:

  • Der Name unserer Abfragemethode muss mit einem der folgenden Präfixe beginnen:find…By , lesen…von , Abfrage…durch , zählen…von , und get…By .
  • Wenn wir die Anzahl der zurückgegebenen Abfrageergebnisse begrenzen möchten, können wir First hinzufügen oder Oben Schlüsselwort vor dem ersten By Wort. Wenn wir mehr als ein Ergebnis erhalten möchten, müssen wir den optionalen numerischen Wert an First anhängen und die Oberseite Schlüsselwörter. Beispiel:findTopBy , findTop1By , findFirstBy und findFirst1By alle geben die erste Entität zurück, die mit den angegebenen Suchkriterien übereinstimmt.
  • Wenn wir eindeutige Ergebnisse auswählen möchten, müssen wir Distinct hinzufügen Schlüsselwort vor dem ersten By Wort. Beispiel:findTitleDistinctBy oder findDistinctTitleBy bedeutet, dass wir alle eindeutigen Titel auswählen möchten, die in der Datenbank gefunden werden.
  • Wir müssen die Suchkriterien unserer Abfragemethode nach dem ersten By hinzufügen Wort. Wir können die Suchkriterien angeben, indem wir Eigenschaftsausdrücke mit den unterstützten Schlüsselwörtern kombinieren.
  • Wenn unsere Abfragemethode x Suchbedingungen angibt, müssen wir ihr x Methodenparameter hinzufügen. Mit anderen Worten, die Anzahl der Methodenparameter muss gleich der Anzahl der Suchbedingungen sein. Außerdem müssen die Methodenparameter in derselben Reihenfolge wie die Suchbedingungen angegeben werden.
  • Wir müssen den Rückgabetyp der Abfragemethode festlegen, indem wir die Regeln befolgen, die im vorherigen Teil dieses Tutorials beschrieben wurden.
Die folgenden Beispiele zeigen, wie wir einfache Abfragemethoden erstellen können, indem wir die Abfragegenerierung aus der Methodennamenstrategie verwenden:

Beispiel 1: Wenn wir eine Abfragemethode erstellen möchten, die den Todo-Eintrag zurückgibt, dessen ID als Methodenparameter angegeben ist, müssen wir eine der folgenden Abfragemethoden zu unserer Repository-Schnittstelle hinzufügen:

import org.springframework.data.repository.Repository;

import java.util.Optional;

interface TodoRepository extends Repository<Todo, Long> {

	/**
	 * Returns the found todo entry by using its id as search 
	 * criteria. If no todo entry is found, this method
	 * returns null. 
	 */
	public Todo findById(Long id);

	/**
	 * Returns an Optional which contains the found todo 
	 * entry by using its id as search criteria. If no to entry
	 * is found, this method returns an empty Optional.
	 */
	public Optional<Todo> findById(Long id);
}

Beispiel 2: Wenn wir eine Abfragemethode erstellen möchten, die Aufgabeneinträge zurückgibt, deren Titel oder Beschreibung als Methodenparameter angegeben ist, müssen wir die folgende Abfragemethode zu unserer Repository-Schnittstelle hinzufügen:

import org.springframework.data.repository.Repository;

import java.util.List;

interface TodoRepository extends Repository<Todo, Long> {

	/**
	 * Returns the found todo entry whose title or description is given
	 * as a method parameter. If no todo entry is found, this method
	 * returns an empty list.
	 */
	public List<Todo> findByTitleOrDescription(String title, String description);
}

Beispiel 3: Wenn wir eine Abfragemethode erstellen möchten, die die Anzahl der Aufgabeneinträge zurückgibt, deren Titel als Methodenparameter angegeben ist, müssen wir die folgende Abfragemethode zu unserer Repository-Schnittstelle hinzufügen:

import org.springframework.data.repository.Repository;

interface TodoRepository extends Repository<Todo, Long> {

	/**
	 * Returns the number of todo entry whose title is given
	 * as a method parameter.
	 */
	public long countByTitle(String title);
}

Beispiel 4: Wenn wir die eindeutigen Aufgabeneinträge zurückgeben möchten, deren Titel als Methodenparameter angegeben ist, müssen wir die folgende Abfragemethode zu unserer Repository-Schnittstelle hinzufügen:

import org.springframework.data.repository.Repository;

import java.util.List;

interface TodoRepository extends Repository<Todo, Long> {

	/**
	 * Returns the distinct todo entries whose title is given
	 * as a method parameter. If no todo entries is found, this
	 * method returns an empty list.
	 */
	public List<Todo> findDistinctByTitle(String title);
}

Beispiel 5: Wenn wir die ersten 3 Todo-Einträge zurückgeben wollen, deren Titel als Methodenparameter angegeben ist, müssen wir eine der folgenden Abfragemethoden zu unserer Repository-Schnittstelle hinzufügen:

import org.springframework.data.repository.Repository;

import java.util.List;

interface TodoRepository extends Repository<Todo, Long> {

	/**
	 * Returns the first three todo entries whose title is given
	 * as a method parameter. If no todo entries is found, this
	 * method returns an empty list.
	 */
	public List<Todo> findFirst3ByTitleOrderByTitleAsc(String title);

	/**
	 * Returns the first three todo entries whose title is given
	 * as a method parameter. If no todo entries is found, this
	 * method returns an empty list.
	 */
	public List<Todo> findTop3ByTitleOrderByTitleAsc(String title);
}

Fahren wir fort und erstellen die Abfragemethode, die die Anforderungen unserer Suchfunktion erfüllt.

Implementieren der Suchfunktion

Wir können die Suchfunktion wie folgt implementieren:

  1. Erstellen Sie eine Abfragemethode, deren Name mit dem Präfix findBy beginnt .
  2. Stellen Sie sicher, dass die Abfragemethode Aufgabeneinträge zurückgibt, deren Beschreibung den angegebenen Suchbegriff enthält. Wir können dies tun, indem wir den Eigenschaftsausdruck anhängen:Beschreibung und das Schlüsselwort:Enthält zum Methodennamen.
  3. Konfigurieren Sie die Abfragemethode so, dass die Informationen eines Aufgabeneintrags zurückgegeben werden, wenn die vorherige (2) oder die nächste (4) Suchbedingung wahr ist. Wir können dies tun, indem wir das Schlüsselwort anhängen:Or zum Methodennamen.
  4. Stellen Sie sicher, dass die Abfragemethode Aufgabeneinträge zurückgibt, deren Titel den angegebenen Suchbegriff enthält. Wir können dies tun, indem wir den Eigenschaftsausdruck anhängen:Title und das Schlüsselwort:Enthält zum Methodennamen.
  5. Stellen Sie sicher, dass bei der Suche die Groß-/Kleinschreibung nicht beachtet wird. Wir können dies tun, indem wir das Schlüsselwort anhängen:AllIgnoreCase zum Methodennamen.
  6. Fügen Sie der Abfragemethode zwei Methodenparameter hinzu:
    1. Spring Data JPA verwendet den descriptionPart Methodenparameter, wenn er sicherstellt, dass die Beschreibung des zurückgegebenen Aufgabeneintrags den angegebenen Suchbegriff enthält.
    2. Spring Data JPA verwendet den titlePart Methodenparameter, wenn er sicherstellt, dass der Titel des zurückgegebenen Aufgabeneintrags den angegebenen Suchbegriff enthält.
  7. Setzen Sie den Typ des zurückgegebenen Objekts auf List .

Der Quellcode unserer Repository-Schnittstelle sieht wie folgt aus:

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

import java.util.List;

interface TodoRepository extends Repository<Todo, Long> {

	List<Todo> findByDescriptionContainsOrTitleContainsAllIgnoreCase(String descriptionPart,
                                                                     String titlePart);
}

Lassen Sie uns weitermachen und herausfinden, wann wir unsere Abfragemethoden erstellen sollten, indem wir die Strategie zur Abfragegenerierung aus dem Methodennamen verwenden.

Wann sollten wir die Abfragegenerierung aus der Methodennamenstrategie verwenden?

Diese Abfragegenerierungsstrategie hat die folgenden Vorteile:

  • Das Erstellen einfacher Abfragen geht schnell.
  • Der Methodenname unserer Abfragemethode beschreibt den/die ausgewählten Wert(e) und die verwendete(n) Suchbedingung(en).

Diese Abfragegenerierungsstrategie hat die folgenden Schwächen:

  • Die Funktionen des Methodennamen-Parsers bestimmen, welche Art von Abfragen wir erstellen können. Wenn der Methodennamen-Parser das erforderliche Schlüsselwort nicht unterstützt, können wir diese Strategie nicht verwenden.
  • Die Methodennamen komplexer Abfragemethoden sind lang und hässlich.
  • Es gibt keine Unterstützung für dynamische Abfragen.

Wenn wir über die Vor- und Nachteile dieser Strategie nachdenken und einen zweiten Blick auf unsere Beispiele werfen, wird klar, dass die Länge unseres Abfragemethodennamens bestimmt, ob wir diese Strategie verwenden sollten oder nicht.

Ich bin kein großer Fan von "superlangen" Methodennamen, weil sie sehr schnell unlesbar werden. Wenn wir den Methodennamen vergleichen:findById mit dem Methodennamen:findByDescriptionContainsOrTitleContainsAllIgnoreCase , stellen wir fest, dass der erste sehr einfach zu lesen ist. Der zweite Methodenname ist nicht annähernd so gut lesbar wie der erste, aber auch (noch) nicht unmöglich zu lesen. Es ist ein Grenzfall.

Da ich leicht lesbaren Code schreiben möchte, sollten wir diese Strategie meiner Meinung nach nur anwenden, wenn wir einfache Abfragen mit nur einer oder zwei Suchbedingungen erstellen.

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

Zusammenfassung

Dieser Blogpost hat uns die folgenden Dinge beigebracht:

  • Wenn wir die Strategie der Abfragegenerierung nach Methodennamen verwenden möchten, muss der Name unserer Abfragemethode mit einem speziellen Präfix beginnen.
  • Wir können eindeutige Ergebnisse auswählen, indem wir Distinct verwenden Schlüsselwort.
  • Wir können die Anzahl der zurückgegebenen Abfrageergebnisse begrenzen, indem wir entweder Top verwenden oder die Erste Schlüsselwort.
  • Wir können Suchbedingungen erstellen, indem wir Eigenschaftsausdrücke und die von Spring Data JPA unterstützten Schlüsselwörter verwenden.
  • Wir sollten die Abfragegenerierung aus der Methodennamenstrategie nur verwenden, wenn unsere Abfrage einfach ist und nur eine oder zwei Suchbedingungen hat.

Der nächste Teil dieses Tutorials beschreibt, wie wir Abfragemethoden mithilfe von @Query erstellen können Anmerkung.

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


Java-Tag