Es gibt eine HQL -Query -Syntax in Hibernate. Aber was wir besser vertraut sind, ist das Zählen von SQL -Anweisungen. Wie sollten wir Hibernate -Unterstützung SQL machen? Wir müssen das nicht berücksichtigen, das Hibernate -Team hat es bereits geschafft.
Lassen Sie uns keinen Unsinn sprechen, nehmen Sie einfach ein Beispiel.
Wählen Sie * aus T_USER usr
Das obige ist eine SQL -Aussage, und es ist Unsinn, den jeder kennt. Was sollen wir tun, wenn Hibernate diese Aussage ausführen möchte? Schauen Sie sich den Code an:
Query query = session.createSQLQuery ("aus T_USER usr"); Das war's, jeder sollte wissen, was noch übrig ist und was Anfragen auftreten, sind normal.
Was wird dann nach der Frage zurückgegeben?
while (iter.hasnext ()) {Object [] objs = (Object []) iter.next (); für (int i = 0; i <objs.length; i ++) {System.out.print (objs [i]); } System.out.println (); } Jedes zurückgegebene Ergebnis ist ein Objekt [] Array.
Zu dieser Zeit kam jemand heraus und sagte, es sei objektorientiert. Ja, es ist objektorientiert, leider gibt es keinen Weg.
Lassen Sie uns weiter beobachten:
Wählen Sie {usr.*} aus T_USER usr Wenn ich das sehe, schätze ich, dass einige Kinderschuhe anfangen zu bewegen. Was sind die Zahnspangen?
Mach dir keine Sorgen, nimm dir Zeit. Lassen Sie uns zuerst den Code lesen.
Die Codekopie lautet wie folgt:
Query query = session.createSQLQuery ("select {usr.*} Von T_USER usr"). Addentity (tuser.class);
AddentitySQLQuery Addentity (String Tablealias, ClassentityType) Deklarieren Sie ein "root" entityParameters: tablealias - die SQL -Tabelle aliasentityType - Der Java -Typ des Entität, der als Stamm hinzugefügt wird
Es ist das gleiche wie es ist, es ist ein leichtes Saugen. Sie können es nur selbst verwenden.
Der erste Parameter bezieht sich auf den Alias der Tabelle. Genau wie in der obigen Aussage lautet der Alias unserer Tabelle USR, so dass der erste Parameter USR ist, und die zweite bezieht sich darauf, auf welche Klasse die Abfrageergebnisse zugeordnet werden müssen. Da wir hier in der Mapping -Datei der T_USER -Tabelle über den Tuser zuordnen, sind wir hier natürlich Tuser. Nach der Überprüfung gibt es SQL -Anweisungen, und das Ergebnis ist des Tuser -Typs.
Die Ergebnisse, die wir gefunden haben, sind:
org.hibernate.tutorial.domain6.tuser@198cb3d
Natürlich muss sich Ihre andere von meinem unterscheiden. Bewegen Sie das Huhn nicht.
Vielleicht müssen wir nicht alles herausfinden, zu diesem Zeitpunkt brauchen wir nur den Alias:
Wählen Sie U.ID als {usr.id}, u.Name as {usr.name}, u.age als {usr.age} von t_user u Wir sehen, dass wir verwendet haben, um den Alias für das Feld anzugeben, und das gleiche gilt für das Programm:
Die Codekopie lautet wie folgt:
Query query = session.createSQLQuery ("u.id as {usr.id}, u.name as {usr.name}, u.age als {usr.age} aus T_USER u"). Addentity ("usr", tuser.class);
<
Beachten Sie, dass der Entitätsname hier mit dem kompletten Paketnamen geschrieben werden muss, andernfalls wird ein Fehler gemeldet. Hier haben wir die Untertitelrückgabe, die den Alias und den Klassennamen der Tabelle angibt, sodass wir zur Laufzeit keine Zusatzheit benötigen.
Schauen Sie sich den Code an:
Query query = session.getNamedQuery ("queryTuser"); Query.SetParameter ("Name", "Shun"); Listlist = query.list (); Iterator iter = list.Iterator ();
Wir sind einfach so in Ordnung. Beachten Sie, dass wir keine Zusatzzusatz hinzugefügt haben, hauptsächlich aufgrund der Konfiguration in der Konfigurationsdatei.
Beachten Sie, dass Sie, wenn Sie in der Konfigurationsdatei konfiguriert sind, über den Rückgabe -Subtag verfügen, um den Tabellenalias und den Klassennamen anzugeben. Dies vermeidet hauptsächlich wiederholte Urteile beim Lesen von Aussagen.
Nachdem wir so lange darüber gesprochen haben, haben wir über Tische mit Alias gesprochen. Was sollten wir also tun, wenn unsere Tabelle keinen Alias hat, aber wir das Ergebnis des Objekts zusammenfassen wollen?
Wählen Sie * aus T_USER usr
Es ist sehr einfach. Rufen Sie einfach die überladene Methodenaddentität von Addentity (Klassenclazz) auf und Sie müssen nur einen Klassennamen ohne den Tischalias angeben.
Hibernate unterstützt natürlich auch gespeicherte Verfahren. Sie müssen nur die Callable-Eigenschaft von SQL-Query in der Konfigurationsdatei auf true einstellen, um anzuzeigen, dass die derzeit als gespeicherten Prozeduren bezeichnet werden. Da ich nicht viel Kontakt zu gespeicherten Verfahren habe, werde ich sie in Zukunft mehr studieren und dann mit Ihnen studieren.
Wenn wir entsprechende Methoden von Datenoperationen wie Session.save aufrufen, wird sie in die integrierte SQL-Anweisung von Hibernate umgewandelt. Was ist jedoch, wenn wir das Format der SQL-Anweisung selbst steuern möchten?
Hibernate hat auch tatsächlich daran gedacht.
Wir fügen es direkt zur Zuordnungsdatei hinzu:
<SQL-INSERT> In T_USER (Name, Alter) Werte (?,?) </SQL-INSERT> <SQL-Update> Aktualisieren von User Set user_name =?, Age =? Wo user_id =? </sql-update>
Beachten Sie, dass dies im Klassen -Tag als Untertitel hinzugefügt werden muss. Wir sind alle Großbuchstaben hier, um sie von den Standardaussagen von Hibernate zu unterscheiden und keine andere Bedeutung zu haben.
Schauen wir uns zuerst den Anruf zum Einfügen an:
User user = new user (); user.setName ("shun123123"); user.Setage (23); Wenn wir Save anrufen, lautet die Hibernate -Erklärung:
Überwintern:
In den Benutzer (user_name, Alter) einfügen (?,?)
Es ruft die Anweisungen im von uns konfigurierten SQL-Insert-Tag auf. Schauen wir uns den Anruf an, um zu aktualisieren:
User user = (user) session.get (user.class, New Long (29)); user.setName ("shun123123"); user.Setage (23); Session.save (Benutzer); Wir rufen Speichern an, es wird automatisch Update anrufen, und die Anweisung zu diesem Zeitpunkt lautet:
Überwintern:
Aktualisieren Sie Benutzer set user_name =?, Ay =? Wo user_id =?Wir sehen, dass die Ausgabeerklärung aktiviert ist, was bedeutet, dass die von uns konfigurierte Anweisung aufgerufen wird.