In Hibernate gibt es eine HQL-Abfragesyntax. Aber wir sind mit SQL-Anweisungen besser vertraut. Wie können wir also dafür sorgen, dass Hibernate SQL unterstützt? Darüber müssen wir nicht nachdenken, das Hibernate-Team hat es bereits getan.
Lassen Sie uns ohne weitere Umschweife ein Beispiel geben.
select * from t_user usr
Das Obige ist eine SQL-Anweisung, die jeder kennt. Wir möchten, dass Hibernate diese Anweisung ausführt. Was sollen wir tun? Schauen Sie sich den Code an:
Query query = session.createSQLQuery("select * from t_user usr");
Das ist alles, den Rest sollte jeder kennen, normale Abfragen.
Was wird also zurückgegeben, nachdem die Abfrage abgeschlossen ist?
while(iter.hasNext()){ Object[] objs = (Object[])iter.next(); for (int i = 0; i < objs.length; i++) { System.out.print(objs[i]); } System.out.println(); }
Jedes zurückgegebene Ergebnis ist ein Object[]-Array,
Zu diesem Zeitpunkt kam jemand heraus und sagte objektorientiert. Ja, es ist objektorientiert, leider gibt es keine Möglichkeit.
Lass uns weiterlesen:
select {usr.*} from t_user usr
Als ich das sah, geraten einige Kinderschuhe wohl in Aufruhr. Was sind das für Zahnspangen?
Beeilen Sie sich nicht, nehmen Sie sich Zeit. Schauen wir uns zunächst den Code weiter an.
Query query = session.createSQLQuery("select {usr.*} from t_user usr").addEntity(TUser.class);
Wir sehen, dass der Unterschied zu zuvor darin besteht, dass wir eine addEntity hinzugefügt haben.
Wir gingen direkt zur API und sahen eine Reihe von Erklärungen wie diese:
addEntity SQLQuery addEntity(String tableAlias, Class entityType) Declare a "root" entity Parameters: tableAlias - The SQL table alias entityType - The java type of the entity to add as a root
Es ist nicht dasselbe. Sie können es nur selbst verwenden.
Der erste Parameter bezieht sich auf den Alias der Tabelle. Genau wie in der obigen Anweisung ist der Alias unserer Tabelle usr, also ist der erste Parameter usr und der zweite Parameter bezieht sich auf die Klasse, die dem Abfrageergebnis zugeordnet werden muss Da wir hier TUser der Tabelle t_user in der Zuordnungsdatei zuordnen, haben wir hier natürlich TUser. Als ich dann nachschaute, kam eine SQL-Anweisung heraus und das Ergebnis war vom Typ TUser.
Das Ergebnis, das wir gefunden haben, ist:
org.hibernate.tutorial.domain6.TUser@198cb3d
Natürlich muss sich Ihres von meinem unterscheiden. Beweg dich nicht.
Vielleicht müssen wir sie nicht alle überprüfen. Zu diesem Zeitpunkt müssen wir nur den Alias festlegen:
select u.id as {usr.id},u.name as {usr.name},u.age as {usr.age} from t_user u
Wir sehen, dass wir ihn verwendet haben as gibt den Alias des Feldes an, im Programm ist es immer noch dasselbe:
Query query = session.createSQLQuery("select u.id as {usr.id},u.name as {usr.name},u.age as {usr.age} from t_user u").addEntity("usr",TUser.class);
Das ist einfach, es gibt nicht viel zu sagen.
Wir haben bereits erwähnt, dass einige Teams vorschreiben, keine SQL-Anweisungen in den Code zu schreiben, wofür Konfigurationsdateien erforderlich sind.
Wir können der Konfigurationsdatei Folgendes hinzufügen:
<sql-query name="queryTUser"> <return alias="usr" entity-name="org.hibernate.tutorial.domain6.TUser" /> select {usr.*} from t_user usr where name=:name </sql-query>
Beachten Sie, dass der Entitätsname hier der vollständige Paketname sein muss, andernfalls wird ein Fehler gemeldet. Hier haben wir das Subtag return, das den Alias und Klassennamen der Tabelle angibt, sodass wir zur Laufzeit kein AddEntity hinzufügen müssen.
Sehen Sie sich den Code an:
Query query = session.getNamedQuery("queryTUser"); query.setParameter("name","shun"); List list = query.list(); Iterator iter = list.iterator();
Beachten Sie, dass wir addEntity nicht hinzugefügt haben, hauptsächlich aufgrund der Konfiguration in der Konfigurationsdatei.
Beachten Sie, dass bei Konfiguration in der Konfigurationsdatei ein Rückgabe-Subtag vorhanden sein muss, der den Tabellenalias und den Klassennamen angibt. Dies geschieht hauptsächlich, um wiederholte Urteile beim Lesen von Aussagen zu vermeiden.
Wir haben schon so lange über Tabellen mit Alias gesprochen. Wenn unsere Tabelle also keinen Alias hat, wir aber die zurückgegebenen Ergebnisse in einem Objekt kapseln möchten, was sollen wir dann tun?
select * from t_user usr
Es ist ganz einfach, rufen Sie einfach die überladene Methode addEntity(Class clazz) von addEntity auf. Sie müssen nur einen Klassennamen angeben, ohne dass ein Tabellenalias erforderlich ist.
Natürlich unterstützt der Ruhezustand auch gespeicherte Prozeduren. Sie müssen nur das Callable-Attribut von sql-query in der Konfigurationsdatei auf true setzen, was bedeutet, dass die gespeicherte Prozedur derzeit aufgerufen wird Da ich viel mit gespeicherten Prozeduren zu tun habe, werde ich sie in Zukunft noch mehr studieren und sie dann mit allen studieren.
Wenn wir session.save und andere entsprechende Datenbearbeitungsmethoden aufrufen, werden diese in die integrierte SQL-Anweisung von Hibernate konvertiert. Was aber, wenn wir das Format der SQL-Anweisung selbst steuern möchten?
Hibernate hat tatsächlich auch daran gedacht.
Wir fügen direkt zur Zuordnungsdatei hinzu:
<sql-insert> INSERT INTO T_USER (NAME,AGE) values (?,?) </sql-insert> <sql-update> UPDATE USER SET USER_NAME=?,AGE=? WHERE uSER_ID=? </sql-update>
Beachten Sie, dass dies als Untertag innerhalb des Klassen-Tags hinzugefügt werden muss. Wir verwenden hier ausschließlich Großbuchstaben, um sie von den Standardanweisungen des Ruhezustands zu unterscheiden, und haben keine andere Bedeutung.
Schauen wir uns zunächst den Aufruf zum Einfügen an:
User user = new User(); user.setName("shun123123"); user.setAge(23);
Wenn wir save aufrufen, lautet die Hibernate-Anweisung:
Hibernate:
INSERT INTO USER(USER_NAME,AGE) values(?,?)
Es ruft die Anweisung im von uns konfigurierten SQL-Insert-Tag auf
Werfen wir einen Blick auf den Update-Aufruf:
User user = (User)session.get(User.class,new Long(29)); user.setName("shun123123"); user.setAge(23); session.save(user);
Wir rufen auf Wenn Sie speichern, wird die Aktualisierung automatisch aufgerufen:
Hibernate:
UPDATE USER SET USER_NAME=?,AGE=? WHERE uSER_ID=?
Wir sehen, dass die Ausgabeanweisung in Großbuchstaben geschrieben ist, was bedeutet, dass die Die von uns konfigurierte Anweisung heißt Anweisung.
Auch die Löschanweisung ist auf die gleiche Weise konfiguriert.
Weitere verwandte Artikel zur einfachen Einführung in die Verwendung von SQL-Anweisungen im Hibernate-Framework von Java finden Sie auf der chinesischen PHP-Website!