JPA unterstützt zwei Möglichkeiten, Abfragen zum Abrufen von Entitäten und anderen persistenten Daten aus der Datenbank auszudrücken: Abfrageanweisungen (Java Persistence Abfragesprache, JPQL) und Kriterien -API (Kriterien -API). JPQL ist eine datenbankunabhängige Abfrageanweisung, mit der logische Entitätsmodelle und nicht physikalische Datenmodelle betrieben werden. Die bedingte API besteht darin, Abfragebedingungen basierend auf dem Entitätsmodell zu erstellen
1. Erste Schritte mit Java Persistente Abfrageberechnungen
Die Codekopie lautet wie folgt: List <Person> persons = entityManager.Createquery ("P von Person p"). GetResultlist ();
1. Diese Abfrageanweisung ähnelt SQL. Der Unterschied zwischen IT und Real SQL besteht jedoch darin, dass sie die Entität aus dem Anwendungsdomänenmodell anstatt eine Auswahlabfrage aus einer Tabelle zu erstellen.
2. Die Abfrageauswahlklausel listet nur den Alias der Abfrageentität auf. Wenn Sie nur eine bestimmte Spalte abfragen, können Sie den DOT -Operator (.) Verwenden, um die Entitätseigenschaften zu navigieren. Wie unten gezeigt:
Die Codekopie lautet wie folgt: List <string> persons = entityManager.Createquery ("Wählen Sie P.Firstname von Person p"). GetResultlist ();
1.1. Filterkriterien
Wie SQL unterstützt auch JPQL, wo Klauseln verwendet werden, mit denen die Suchkriterien gefiltert werden. Beinhaltet die meisten Operatoren, wie z.
Die Codekopie lautet wie folgt: List <Person> persons = entityManager.Createquery ("Wählen Sie P aus Person p WHERE P.age> 23"). GetResultlist ();
1.2. Projektionsergebnisse
Wenn die Menge der abgefragten Daten relativ groß ist, können Sie mit der Projektion nur nützliche Spalten abfragen.
Die Codekopie lautet wie folgt:/Projektliste <Objekt> persons = entityManager.Createquery ("Wählen Sie P.Firstname, P.age von Person p"). GetResultlist ();
1.3. Aggregationsanfrage
Die aggregierte Abfragesyntax von JPQL ähnelt SQL. Zum Beispiel zählen
Die Codekopie lautet wie folgt: List <Ganzzahl> count = entityManager.Createquery ("Wählen Sie Count (p) von Person p"). GetResultlist ();
1.4. Abfrageparameter
JPQL unterstützt zwei Arten von Parameterbindungssyntax.
1. Positionsparameterdarstellung
Wo der Parameter in der Abfragezeichenfolge angezeigt wird, ist die Zahl, die dem Parameter unmittelbar nach einem Fragezeichen (?) Folgt. Bei der Ausführung einer Abfrage gibt der Entwickler die Parameter an, die ersetzt werden sollten
Query query = entityManager.createquery ("p Person p person p won p.age =? 1 und p.firstname =? 2"); query.setParameter (1,21); query.setParameter (2, "Jack"); 2. Parameternotation genannt
Durch die Befolgung eines Colon (:) und in der Abfragezeichenfolge gibt der Entwickler den Parameternamen an, der bei der Ausführung der Abfrage ersetzt werden sollte
Query query = entityManager.createquery ("Select p aus Person p WHERE P.age =: Alter und P.Firstname =: Name"); Query.SetParameter ("Alter", 21); Query.SetParameter ("Name", "Jack");2. Definieren Sie die Abfrage
JPA bietet Abfragen und TypedQuery (von JPA 2.0 eingeführt) Schnittstellen zum Konfigurieren und Ausführen von Abfragen. Abfrage gibt den Objekttyp zurück, während typedQuery den angegebenen Klassentyp zurückgibt.
// KEINEM GEZEICHNISER TYP, RETUCT -Objekttyp Abfrage q = EntityManager.Createquery ("P von Person p"); // Geben Sie den Rückgabetyp als Person Type TypedQuery <person> q1 = entityManager.createquery an ("Select P aus Person p", Person.Class);2.1. Dynamische Abfragedefinition
JPA Query Engine kann JPQL-Zeichenfolgen in Syntaxbäume analysieren, die Metadaten von Entitätsobjekten-Relationskarten in Ausdrücken erhalten und dann äquivalente SQL erzeugen. Daher gibt es zwei Möglichkeiten, dynamische Abfragen durchzuführen.
1.Split String -Methode
Tipp: verursacht SQL -Injektionsprobleme
/** * Dynamisches Spleißen String -Konstruktion Abfrage Bedingungen * * @param name * @param ay * @return */public static String queryPersonJpql (String -Name, int age) {string queryql = "Wählen Sie P aus Person p, wo p.firstname = '" + name + "' und P.age =" + AGE; return queryql;} // query query aufrufen 2. Dynamischer parametrisierter Konstruktion von Abfragebedingungen (empfohlen)
/** * Dynamic Parameterized Construction Query Bedingungen * * @return */public static String queryPersonJpqlByParams () {String queryql = "Wählen Sie P aus Person p, wobei p.firstname =: Name und P.age =: Alter"; return queryql;} query query = entityManager.createquery (queryPersonjpqlByParams ()); query.setParameter ("Name", "Jack"); Query.SetParameter ("Alter", 21);2.2. Benannte Abfragedefinition
Named Query ist ein leistungsstarkes Werkzeug. Verwenden Sie die @NamedQuery -Annotation, um eine benannte Abfrage zu definieren, die über die Klassendefinition eines Unternehmens platziert werden kann. Diese Annotation definiert den Namen der Abfrage und ihres Textes.
Tipp: Die benannte Abfrage wird in der Entitätsklasse platziert, die dem Abfrageergebnis entspricht
@Entity@namedQuery (name = "findByage", query = "Wählen Sie P aus Person p WHERE P.AGE =: AGE") public class Person {// weggelassen} ausgelassen} Der in Tipp definierte Name: NamedQuery muss in der gesamten Persistenzeinheit eindeutig sein, andernfalls ist ein Fehler in der Operation.
z.B:
Die Codekopie lautet wie folgt:
Ausnahme in Thread "Main" org.hibernate.duplicatemapPingexception: Duplicate Abfrage Mapping FindByage unter org.hiNNATE.BOOT.Internal.inflightMetAdatacollectorImpl.Checkqueyname
Anruf
Die Codekopie lautet wie folgt:
Liste <Person> people = entityManager.createnamedQuery ("findByage", Person.class) .setParameter ("Alter", 21) .GetResultList ();
Wenn eine Klasse zwei oder mehr benannte Abfragen definiert, muss sie in @NamedQueries () platziert werden.
2.3.Binding -Parameter
Im vorherigen Beispiel können wir sehen, dass es zwei Möglichkeiten gibt, Parameter zu binden: 1. Positionsparametrisierung. 2. NAMAMALPARAMEIDISCHE BINDING. Alle sind durch die SetParameter -Methode der Abfrageschnittstelle gebunden.
1. Positionsparametrisierung
TypedQuery <x> setParameter (int Position, Objektwert);
2. NAME -Parametrisierung
TypedQuery <x> setParameter (String -Name, Objektwert);
Das erste ist die parametrisierte Position der Position. Wenn sich die Position ändert, muss der gebundene Code geändert werden. Der zweite Typ wird empfohlen.
2.4. Abfrage ausführen
Die Abfrageschnittstelle und die TypedQuery -Schnittstelle bieten drei verschiedene Möglichkeiten, Abfragen auszuführen.
1.executeupdate
Wird verwendet, um Stapel -Updates oder Löschen durchzuführen
2.Getingleresult
Holen Sie sich ein einzelnes Ergebnissatz. Wenn keine Daten erhalten werden, wird eine NoresultException geworfen. Wenn mehrere Datenstücke erhalten werden
3.GetResultlist
Holen Sie sich den entsprechenden Ergebnissatz und geben Sie die Reihenfolge des Satzes an. Die Liste muss als Rückgabewerttyp verwendet werden. Wenn keine Daten erhalten werden, wird ein leerer Satz zurückgegeben und keine Ausnahme geworfen
2.5. Pagination
Die Pagination -Abfrage kann durch die Methoden setfirstresult () und setMaxResults () abgeschlossen werden
Die Abfrage -Seitennummer beträgt 0 und 2 Datenstücke werden auf jeder Seite angezeigt
Die Codekopie lautet wie folgt:
Liste <Person> people = entityManager.createquery ("Select P aus Person p", Person.class) .setFirstresult (0) .setMaxResults (2) .GetResultlist ();
Tipp: Kann nicht für Abfragen verwendet werden, die durch Sammlungsbeziehungen verbunden sind, da diese Abfragen doppelte Werte zurückgeben können.
2.6. Abfragetimeout
Wenn eine Anwendung eine Grenze für die Abfrage -Antwortzeit festlegen muss, können Sie die Eigenschaft javax.Persistence.Query.Timeout in der Abfrage (eingeführt von JPA 2.0) festlegen oder sie als Teil der Persistenzeigenschaft verwenden. Diese Eigenschaft definiert die Anzahl von == Millisekunden, die vor der Beendigung der Abfrage ausgeführt werden dürfen. Wenn das Abfragetimeout, wird eine QueryTimeOutException geworfen.
TypedQuery <Person> query = entityManager.createquery ("Select P von Person p", Person.class); // Die Einheit ist Millisekunden Javax.Persistence.Query.TimeOutQuery.SetHinT ("Javax.Persistence.Query.Timeout", 5000); LIST <Spersonen <personen = personen = query.getresultlist ().2.7. Batch -Updates und Löschungen
Die Stapel -Update -Entität wird über die Update -Anweisung abgeschlossen. Die Löschung von Entitäten wird durch Löschen von Anweisungen durchgeführt. Beide geben die Eigenschaften einer Entität und ihrer Klasse an.
EntityManager.Gettransaction (). begin (); query query = entityManager.createquery ("Person aktualisieren p set p.firstname =: name wob entityManager.createquery ("Person löre p wobei p.id =: id"); query1.setParameter ("id", 9); query.executeUpdate (); EntityManager.Gettransaction (). commit ();3. Vorschläge für die Verwendung von JPQL -Abfrage
In Anwendungssystemen wird die Anzahl der Abfragen normalerweise mehr als das Hinzufügen, Ändern und Löschen verwendet. Daher ist es besonders wichtig, die Abfrage zu verwenden und vernünftig anzuzeigen.
1. Es wird empfohlen, die benannte Abfrage (mit dem NamensQuery) zu verwenden.
Durch persistenz bereitgestellte Programme verwenden normalerweise vorkompilierte Methoden, um benannte Abfragen als Teil der Programminitialisierungsphase zu verwenden. Dies vermeidet den Systemaufwand der kontinuierlichen Analyse von JPQL und der Generierung von SQL.
2. Verwenden Sie die Projektion, um zuerst eine kleine Anzahl von Spalten abzurufen.
Die JPA -Abfrage gibt normalerweise alle Spalten der gesamten Entität zurück, aber für eine große Datenmenge müssen nicht alle Entitätsspalten verwendet werden. Dann können wir die Projektion verwenden, um es zu handhaben.
Liste <list <list <Object [] >> persons = entityManager.createquery ("Neue Liste (FirstName, Alter) von Person p"). GetResultlist (); für (Objekt O: persons) {System.out.println (O);} // Ausgabeergebnis [Jack, 21] [Jack, 21] [Jack, 21] [ly, 19] [Tom, 19] [Tom, 23] [Tom, 23] [Tom, 23] [Tom, 23] [Tom, 23] [Tom, 23] [Tom, 23] [Tom, 23] [Tom, 23] [Tom, 23] [Tom, 23] [Tom, 23] [Tom, 23] [Tom, 23] [3] [ly, 19] [ly, 19] 19] [19] [19] [19] 19] [19] [19] [19] [19] [19], 19] ,afesDas obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.