Die Hauptforschung in diesem Artikel ist der relevante Inhalt der Hibernate -HQL -Abfrage wie folgt.
Hibernate Query Language (HQL) ist eine vollständig objektorientierte Abfrageanweisung mit sehr leistungsstarken Abfragefunktionen. Es hat Polymorphismus, Assoziation und andere Merkmale. Die HQL -Abfrage ist auch die von Hibernate offiziell empfohlene Abfragemethode.
Als nächstes analysieren wir die relevanten Abfragemethoden durch eine Fallstudie
Classs.java:
öffentliche Klassenklassen {/*Klassen -ID*/private int id;/*Klassenname*/privater String -Name;/*Beziehung zwischen Klasse und Schülern*/privat Set <student> Studenten; // Setter- und Getter -Methoden weglassen}Student.java:
öffentliche Klasse Student {/*Student ID*/private int id;/*Schülername*/privater String -Name;/*Beziehung zwischen Schülern und Klasse*/private Klassen Klassen; // Setter- und Getter -Methoden weglassen}Klassen.hbm.xml:
<? -> <class name = "classes" table = "t_classeses" Lazy = "false"> <id name = "id"> <generator/generator/> </id> <Property name = "name"/> <!-Eins-zu-Many-Mapping, Inverse = "True" bedeutet, die Beziehung mit dem Peer-> <set name = "students" inverse = "true" zu übergeben. </set> </class> </hibernate-Mapping>
Student.hbm.xml:
<? table = "t_student"> <id name = "id"> <generator // id> <!-Map normale Eigenschaften-> <Eigenschaft name = "name"/> <!-Viele zu-eins-Zuordnungen, fügen Sie dem mehrfachen Ende-> <viele zu-eins Name = "Klassen" CLAUSS "CLOSSID"/> </> </classe> </hibernate-maping> hinzu "/> </class> </hibernate-maping>
/*Gibt die Liste der Ergebnisssatz -Attributliste zurück, der Elementtyp und die Attributtypen in der Entitätsklasse sind gleich*/ list <string> student> session.createquery ("Name aus dem Schüler auswählen"). List (); /*Ave*/ for (iterator <string> iter = students.iterator (); iter.hasnext ();) {String name = (string) iter.next (); System.out.println (Name); }Hinweis: Wenn Sie ein einzelnes Attribut abfragen, ist die zurückgegebene Menge eine Sammlung, und der Typ des Sammelelements ist der Typ des Attributs.
/*Abfragen Sie mehrere Eigenschaften ab, senden Sie ein Objektarray zurück*/ list <Object []> students = session.createquery ("ID, Name aus dem Schüler auswählen"). List (); /*Transip*/ for (iterator <object []> iter = students.iterator (); iter.hasnext ();) {Object [] obj = (Object []) iter.Next (); System.out.println (obj [0] + "," + obj [1]); }Hinweis: Das Abfragen mehrerer Attribute gibt eine Sammlung von Typ -Objekt -Arrays zurück. Das ist leicht zu verstehen. Wenn Sie ein einzelnes Attribut abfragen, ist der zurückgegebene Sammlungselementtyp, es ist der Typ des Attributs, aber was ist mit mehreren Typen? Das muss ein Objektarray sein, das zu verarbeiten, dh Objekt [].
/*Wir haben den entsprechenden Konstruktor für das Entitätsobjekt festgelegt und können dann eine Sammlung von Entitätsobjekttypen zurückgeben, indem wir das Objekt abfragen /*Reise*/ for (iterator iter = students.iterator (); iter.hasnext ();) {student student = (student) iter.next (); System.out.println (student.getId () + "," + student.getName ()); }Hinweis: Zusätzlich zur zweiten Methode können wir ein Objektarray zurückgeben, können wir den entsprechenden Konstruktor für das Entitätsobjekt auch festlegen und das Objekt dann abfragen, indem wir das Objekt abfragen, und dann eine Sammlung von Entitätstypen zurückgeben.
/*Aliase können verwendet werden /*Transip*/ for (iterator <object []> iter = students.iterator (); iter.hasnext ();) {Object [] obj = (Object []) iter.Next (); System.out.println (obj [0] + "," + obj [1]); } /*Rückgabe ist eine Sammlung von Entitätsobjekttypen*/ list <Student> students = session.createquery ("From Student"). List (); /*Transip*/ for (iterator <Studest> iter = student.Iterator (); iter.hasnext ();) {student student = (student) iter.next (); System.out.println (student.getName ()); }Hinweis: Abfrageentitäten können direkt die Form des From -Class -Namens verwenden.
/*Verwenden Sie SELECT, um alias*/ list <student> student = session.createquery ("aus student S"). List (); /*Transip*/ for (iterator <Studest> iter = student.Iterator (); iter.hasnext ();) {student student = (student) iter.next (); System.out.println (student.getName ()); }Hinweis: Wenn Sie das Schlüsselwort auswählen möchten, müssen Sie einen Alias verwenden. Ein weiterer Punkt muss beachtet werden: HQL unterstützt nicht die Form von Select *.
/ ** * Wenn Sie die Liste verwenden, um das Entitätsobjekt abzufragen, wird eine Abfrageanweisung ausgestellt, um die Entitätsobjektdaten zu erhalten. Student "). List (); /*Reise*/ for (iterator <Student> iter = student.Iterator (); iter.hasnext ();) {student student = (student) iter.next (); System.out.println (student.getName ()); }HINWEIS: Wenn Sie die .List () -Methode verwenden, um Objekte abzufragen, wird nur eine Anweisung ausgegeben, dh eine Anweisung, die die physischen Objektdaten erhält.
/*** Das N+1 -Problem tritt auf. Der sogenannte N+1 bezieht sich auf die Ausgabe von N+1 SQL-Anweisungen * * 1: Ausgabe einer Anweisung, in der die ID-Liste befragt wird. Student0_.CreateTime als createTime0_0_, student0_.classesid as classiSID0_0_ * von t_student student0_ WHERE STUDENT0_.ID =? * */ Iterator <Student> iter = session.createquery ("From Student"). Iterate (); /*Ave*/ while (iter.hasnext ()) {student student = (student) iter.next (); System.out.println (student.getName ()); }Hinweis: Wenn Sie eine Objektabfrage über Iterator () ausführen, werden n+1 Anweisungen ausgegeben. Zunächst wird eine Erklärung ausgegeben, um die ID des Entitätsobjekts abzufragen, und dann werden n -Anweisungen auf der Grundlage ihrer jeweiligen IDs ausgestellt, um N -Objekte abzufragen. Die formale Leistung ist relativ schlecht.
/*Speichern Sie die abfragte Sammlung im Cache erster Ebene, d. H. Cache auf Sitzungsebene*/ List <Studenten> student> Session.createquery ("From Student"). List (); /*Transip*/ for (iterator <Studest> iter = student.Iterator (); iter.hasnext ();) {student student = (student) iter.next (); System.out.println (student.getName ()); } System.out.println ("---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- In der Listenoperation werden die Daten in den Sitzungs-Cache (Cache der ersten Ebene) platziert. Wenn Sie ITERATE verwenden, wird eine Anweisung, die die ID-Liste abfragt, und dann werden die entsprechenden Daten in den Cache geladen. Cache kann die Leistung verbessern, ansonsten tritt ein Problem auf**/ Iterator <Student> iter = session.createquery ("From Student"). Iterate ();Hinweis: Tatsächlich bietet Hibernate Iterator () -Anfrage zur Verbesserung der Leistung. Warum hilft es also zu viel? Der Grund dafür ist, dass Iterator () Daten aus dem Cache der ersten Ebene abreißt. Wenn es im Cache Daten gibt, wird seine Effizienz zweifellos ziemlich leistungsfähig sein. Wie könnte es jedoch zum ersten Mal Daten im Cache geben? Dies führt zum sogenannten N+1-Problem. Der obige Code kann das Problem n+1 vermeiden. Seine Idee ist es, List () zuerst abzufragen, da nach der List () abfragt wird, Daten in der Cache-Zusammenfassung der ersten Stufe vorhanden sind, und bei Verwendung von Iterator () ist die Effizienz sehr hoch.
/*Abfrage gemäß den Bedingungen (Alias werden hier normalerweise verwendet, was bequemer ist)*/ list <Objekt []> students = session.createquery ("s.id, s.name aus students, wobei s.name '%0%'"). List (); /*Ave*/ for (iterator <object []> iter = students.iterator (); iter.hasnext ();) {Object [] obj = (Object []) iter.Next (); System.out.println (obj [0] + "," + obj [1]); }Hinweis: Die bedingte Abfrage ist die gleiche wie native SQL, die beide Schlüsselwörter sind. Darüber hinaus ist es normalerweise bequemer, Alias zu verwenden. Das obige Programm soll mehrere Attribute abfragen, sodass es eine Sammlung von Objektarray -Typen zurückgibt, und die Elemente im Objektarray sind die entsprechenden Attribute.
/*Chenged Programming*/ List <Objekt []> student = session.createquery ("select S.Id, s.name aus students where s.name mögen?") .SetParameter (0, "%0%") .List (); /*Ave*/ for (iterator <object []> iter = students.iterator (); iter.hasnext ();) {Object [] obj = (Object []) iter.Next (); System.out.println (obj [0] + "," + obj [1]); }Hinweis: Parameter können durch Platzhalter weitergeleitet werden, die die SQL -Injektion verhindern können.
/*CHIP -Programmierung*/ List <Objekt []> students = session.createquery ("ss s.id, s.name aus students wobei s.name wie: myName") .setParameter ("myName", "%0%") .List (); /*Objektarray*/ for (iterator <eljekts []> iter = student.Iterator (); iter.hasnext ();) {Object [] obj = (Object []) iter.next (); System.out.println (obj [0] + "," + obj [1]); }Hinweis: Wie: Es gibt keinen Platz nach dem MyName -Dickdarm, da sonst ein Fehler auftritt.
[Java] Einfaches Kopieren anzeigen/ * übernimmt die in Methode annimmt, nur ein formaler Parameter kann verwendet werden /*Transip*/ for (iterator <object []> iter = students.iterator (); iter.hasnext ();) {Object [] obj = (Object []) iter.Next (); System.out.println (obj [0] + "," + obj [1]); }Hinweis: In den Klammern befindet sich nur einen formalen Parameter. Wenn wir den Parameterwert festlegen, können wir den Wert über das Objektarray übergeben.
/* Abfragen der Schüler 2009-08 können Sie die Funktion von MySQL aufrufen. /*Ave*/ for (iterator <object []> iter = students.iterator (); iter.hasnext ();) {Object [] obj = (Object []) iter.Next (); System.out.println (obj [0] + "," + obj [1]); } SimpleDateFormat SDF = new SimpledateFormat ("yyyy-mm-dd hh: mm: ss"); /*Schüler von 2009-08-01 bis 2009-08-20 können die Date Formatierungsfunktion von MySQL aufrufen SDF.Parse ("2009-08-20 23:59:59") .List (); /*Transip*/ for (iterator <object []> iter = students.iterator (); iter.hasnext ();) {Object [] obj = (Object []) iter.Next (); System.out.println (obj [0] + "," + obj [1]); } / * Verwenden von SELECT * Sie müssen ursprüngliche SQL -Anweisungen verwenden, und es ähnelt der Abfrage mehrerer Eigenschaften von HQL. Daher wird eine Sammlung von Objektarray -Typen */ list <Objekt []> students = session.createSQLQuery ("SELECT * From t_student"). List () zurückgegeben. /*Transip*/ for (iterator <object []> iter = students.iterator (); iter.hasnext ();) {Object [] obj = (Object []) iter.Next (); System.out.println (obj [0] + "," + obj [1]); }HINWEIS: HQL unterstützt die Abfrageform von Select *nicht, aber Hibernate unterstützt die ursprünglichen SQL -Anweisungen. Wir können SQL -Anweisungen zur Abfrage verwenden. Darüber hinaus ähnelt es dem Abfrage mehrere Attribute von HQL, sodass es eine Sammlung von Objektarray -Typen zurückgibt.
/*Seitenabfrage, setfirstresult (1) bedeutet aus den ersten Daten; setMaxResult (2) bedeutet 2 Daten werden pro Seite angezeigt. /*Reise*/ for (iterator iter = students.iterator (); iter.hasnext ();) {student student = (student) iter.next (); System.out.println (student.getName ()); } /*Navigationsabfrage, s.classes.name navigieren von Schüler zu Klasse in der Klasse (dies navigiert von mehr Ende zu weniger Ende, was ebenfalls möglich ist) /*Reise*/ for (iterator <Student> iter = student.Iterator (); iter.hasnext ();) {student student = (student) iter.next (); System.out.println (student.getName ()); }HINWEIS: Die s.classes.name In der obigen Abfrageanweisung soll der Name der Klasse von der Schülernavigation in die Klassenklassen erhalten. Sie können auch umgekehrt navigieren: Navigieren Sie von Klasse zu Schüler, um ein bestimmtes Attribut zu erhalten. Darüber hinaus bedeutet die Abfrageanweisung im Programm, alle Schüler mit 2 im Klassennamen abzufragen.
/ *Innere Verbindung verwenden Sie einfach das Schlüsselwort Join */ list <Object []> students = session.createquery ("Wählen Sie C.Name, s.Name aus den Students, treten Sie s.classes c") .List (); /*Transaktion*/ for (iterator <eloct []> iter = students.iterator (); iter.hasnext ();) {Object [] obj = (Object []) iter.Next (); System.out.println (obj [0] + "," + obj [1]); }HINWEIS: Das Schlüsselwort in der inneren Verbindung ist Join und die Verbindung erfolgt weiterhin mit Alias und Navigation. Die obige Abfrageanweisung bedeutet: Abfragen Sie den Unterrichtsnamen und den Schülernamen aus der Schülertabelle und der Klassentabelle ab (innere Verbindung bedeutet, dass die Abfragebedingungen würdig sein müssen, z. B. keine Klasse oder keine Schüler oder Schüler können ohne Klassen nicht abfragen).
/*Links -Join verwendet Schlüsselwort Links Join*/ list <Objekt []> students = session.createquery ("Select C.Name, S.Name aus students links Join s.classes c") .List (); /*Transip*/ for (iterator <object []> iter = students.iterator (); iter.hasnext ();) {Object [] obj = (Object []) iter.Next (); System.out.println (obj [0] + "," + obj [1]); }HINWEIS: Das für den linke Join verwendete Schlüsselwort bleibt verbleiben. Die obige Abfrageanweisung bedeutet: Abfragen Sie den Unterrichtsnamen und den Schülernamen aus der Schüler- und Klassentabelle. Da es sich um eine nach links verbundene Links handelt, werden Schüler ohne Unterricht ebenfalls abfragt.
[Java] Klycle Copy/*Right -Join -Schlüsselwort ist rechts Join*/ list <Object []> students = session.createquery ("Select C.Name, S.Name aus dem Rechtsanschluss von Students Rechts s.classes c") .List (); /*Transip*/ for (iterator <object []> iter = students.iterator (); iter.hasnext ();) {Object [] obj = (Object []) iter.Next (); System.out.println (obj [0] + "," + obj [1]); }HINWEIS: Das Schlüsselwort mit dem richtigen Join ist richtig. Die obige Abfrageanweisung bedeutet: Abfragen Sie den Unterrichtsnamen und den Schülernamen aus der Schüler- und Klassentabelle. Da es sich um einen recht verbundenen Klassen ohne Schüler handelt, werden erfragt.
Long Count = (Long) Sitzung.Createquery ("Wählen Sie Count (*) aus dem Schüler"). Uniqueresult ();Hinweis: In HQL können nur statistische Abfragen mit *verwendet werden. Uniqueresult () bedeutet, dass es nur eine Ergebnismenge und den zurückgegebenen Typ lang gibt.
/*Abfrageanweisung*/ String hql = "SELECT C.NAME, Zählungen aus den Klassen C Join C.Students S Group By C.Name Order by C.Name"; List <Object []> students = session.createquery (HQL) .List (); /*Reise*/ für (int i = 0; i <students.size (); i ++) {Object [] obj = (Object []) Studenten.get (i); System.out.println (obj [0] + "," + obj [1]); }HINWEIS: HQL unterstützt auch Gruppierung, Sortierung usw. Die obige Anweisung bedeutet: Abfragen Sie den Namen jeder Klasse und befragen
In diesem Artikel geht es um das Beispiel für den Hibernate -HQL Query -Code. Ich hoffe, es wird für alle hilfreich sein. Interessierte Freunde können weiterhin auf andere verwandte Themen auf dieser Website verweisen. Wenn es Mängel gibt, hinterlassen Sie bitte eine Nachricht, um darauf hinzuweisen. Vielen Dank an Freunde für Ihre Unterstützung für diese Seite!