Verwendung von @NamedQuery in Spring Data JPA

In meinem vorherigen Artikel habe ich erklärt, wie man die @Query-Annotation zum Schreiben benutzerdefinierter Abfragen für Spring Data JPA-Anwendungen verwendet. In diesem Beitrag werde ich eine andere Art des Schreibens der benutzerdefinierten Abfragen erläutern @NamedQuery Annotation, die Teil der JPA-Spezifikation ist.

Was ist NamedQuery?

  • In JPA gibt es zwei Arten von Abfragen. Einer ist dynamisch und der andere ist statisch. Benannte Abfragen fallen in die zweite Kategorie.
  • Mit benannten Abfragen können Sie Ihre statischen Abfragen so organisieren, dass sie besser lesbar und wartbar sind.
  • Die benannten Abfragen werden an einer einzigen Stelle in der Entitätsklasse selbst definiert, wobei jede Abfrage ihren eindeutigen Namen hat. Aus diesem Grund wird sie als benannte Abfrage bezeichnet.
  • @NamedQuery Anmerkungen können nur auf Klassenebene angewendet werden.
  • Beachten Sie, dass benannte Abfragen einen globalen Geltungsbereich haben (auf die in der gesamten Persistenzeinheit zugegriffen werden kann), daher sollte jede Abfrage eindeutig identifiziert werden, auch wenn Sie Abfragen für verschiedene Entitäten definieren.
  • Nehmen wir an, Sie haben eine benannte Abfrage mit dem Namen „findOne“ für eine Entität „Employee“, aber wenn Sie versuchen, eine andere benannte Abfrage mit demselben Namen „fineOne“ für eine andere Entität „Benutzer“ zu schreiben, werden Sie auf eine Ausnahme bezüglich der doppelten benannten Abfrage stoßen. Dies ist der Hauptgrund dafür, dem benannten Abfragenamen den Entitätsnamen voranzustellen, damit er eindeutig referenziert wird.

Es gibt zwei Annotationen, die zum Definieren der benannten Abfragen verwendet werden:

  • Wenn Sie eine einzelne Abfrage definieren, verwenden Sie @NamedQuery
  • Wenn Sie mehr als eine benannte Abfrage definieren müssen, verwenden Sie @NamedQueries

Spring Data JPA NamedQuery

Wie verwende ich @NamedQuery?

Im Folgenden sind die Schritte aufgeführt, die zum Implementieren benannter Abfragen in Ihrer Anwendung erforderlich sind.

Definieren Sie @NamedQuery in der Entitätsklasse

Erstellen Sie zunächst benannte Abfragen in Ihrer Entitätsklasse. Alle benannten Abfragen dürfen nur in den Entitätsklassen geschrieben werden. Für Abfragemethoden sind keine Abfragen auf Methodenebene definiert.
Die Beispieldefinition würde so aussehen:

@Entity
@NamedQuery(name="Book.findByPrice",
         query="select name,author,price from Book b where b.price=?1")
public class Book implements Serializable{
	private static final long serialVersionUID = 1L;
	@Id
	long id;
	@Column(name="name")
	String name;
	@Column(name="author")
	String author;
	@Column(name="price")
	long price;	

//getters and setters

Erstellen Sie ein Repository mit der Abfragemethode

Zweitens: Erstellen Sie ein benutzerdefiniertes Spring Data-Repository und eine Abfragemethode. Der Methodenname und der benannte Abfragename in der Entitätsklasse müssen identisch sein. Stellen Sie sicher, dass Sie es nicht verwenden @Query Anmerkung mit benutzerdefinierter Abfrage. Weil, @Query hat immer Vorrang vor anderen Optionen.
Hier ist die Beispiel-Repository-Schnittstelle für die oben genannte Abfrage.

public interface BookNamedQueryRepositoryExample 
                         extends Repository<Book, Long> {
	// Query will be used from Named query defined at Entity class
	List<Book> findByPrice(long price);
}

Wann sollte NamedQuery verwendet werden?

Benannte Abfragen sind ideal, wenn Sie eine Abfrage haben, bei der es sehr unwahrscheinlich ist, dass sie sich zur Laufzeit ändert. Hier möchte ich die Merkmale der benannten Abfrage auflisten. Dies wird Ihnen bei Ihrer Entscheidung helfen, ob Sie sich für eine benannte Abfrage entscheiden müssen oder nicht.

  • Alle benannten Abfragen werden beim Start der Anwendung validiert und es kommt zur Laufzeit zu keinem Fehler.
  • Die Wartung ist einfacher, da alle Abfragen an einem einzigen Ort gespeichert werden.
  • HQL- und native SQL-Abfragen können ohne Codeänderungen verwendet und ersetzt werden (Sie müssen Ihren Code nicht neu kompilieren).
  • Es gibt keine Unterstützung für die dynamischen Abfragen.
  • Wir können die komplizierten SQL-Abfragen schreiben und die Ergebnisse Objekten zuordnen.
  • Wenn wir eine bestehende Anwendung auf die Verwendung von Spring Data JPA umstellen, müssen wir die benannten Abfragen nicht in Methoden verschieben. Sie müssen lediglich Abfragemethoden für jede benannte Abfrage erstellen und diese zuordnen.

Quellcode-Download

Dieser Beispielquellcode enthält viele Beispiele für Spring Data JPA und nicht nur für @NamedQuery. Dieses Beispiel verwendet Frühlingsstiefel zum Verpacken und Entfalten von Federanwendungen.

Symbol

Spring Data JPA mit Spring Boot-Beispielanwendung

1 Datei(en) 12,43 KB Download: Spring Data JPA mit Spring Boot

Abschluss

In diesem Tutorial habe ich die Verwendung erklärt @NamedQuery und die Vorteile der Verwendung benannter Abfragen. Die Verwendung benannter Abfragen ist ideal, wenn die Abfragen statisch sind und zum Zeitpunkt der Abstimmung weniger wahrscheinlich geändert werden. Außerdem ist es einfach, vorhandene Anwendungen auf Spring Data JPA zu migrieren.

Wenn Sie in Ihrem Projekt benannte Abfragen verwendet haben, teilen Sie uns bitte Ihre Erfahrungen und Gedanken im Kommentarbereich mit. Die besten Kommentare werden in diesem Tutorial aktualisiert und für kostenlose Buchaktionen ausgewählt.

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Nach oben scrollen