Sprechen wir über Kriterienabfragen, was für US -Programmierer, die mit SQL -Aussagen nicht sehr vertraut sind, einfach ist.
Schauen wir uns ohne weiteres das Beispiel an:
Die Entitätsklasse lautet wie folgt:
Benutzer im öffentlichen Klassen implementiert serialisierbar {private statische endgültige long serialversionuid = 1l; öffentliche lange Ausweis; privater Zeichenfolge Name; privates int Alter; // Get/Set -Methode auslassen} Wir werden die Zuordnungsdatei nicht schreiben, es ist eine sehr einfache Entität. Wenn Sie Kinderschuhe nicht verstehen, beziehen Sie sich bitte auf meine anderen Artikel in der Kategorie Hibernate.
Lassen Sie uns als nächstes sehen, wie man Kriterien zur Abfrage verwendet:
public static void main (string [] args) {configuration cfg = new configuration (). configure (); SessionFactory SessionFactory = cfg.buildSessionFactory (); Session Session = SessionFactory.openSession (); Kriterienkriterien = Sitzung.Createcriteria (user.class); Criteria.Add (restriktions.eq ("Name", "Shun")); Listlist = criteria.list (); Iterator iter = list.Iterator (); while (iter.hasnext ()) {user user = (user) iter.next (); System.out.println (user.getName ()+":"+user.getage ()); } Session.close (); } Wenn man den Code sieht, ist es eine sehr einfache Zeichenfolge.
Wir sind alle mit den vorherigen vertraut und sehen den Code, nachdem wir die Sitzung erstellt haben:
Kriterienkriterien = Sitzung.Createcriteria (user.class); Criteria.Add (restriktions.eq ("Name", "Shun")); Diese beiden Code -Sätze sind die wichtigsten Punkte. Lassen Sie uns analysieren, was genau bedeutet?
Im ersten Satz erhalten wir über die Sitzung ein Objekt der Kriterien -Implementierungsklasse, und im zweiten Satz fügen wir eine Bedingung über die Add -Methode hinzu, und EQ repräsentiert Gleichheit. Hibernate3 wurde zuvor durch Expression.EQ implementiert. Nachdem wir nach 3 Jahren aufgegeben wurden, verwendeten wir die Beschränkungsklasse, um sie zu implementieren, was dem Ausdruck entspricht. Schauen wir uns die API an und stellen fest, dass der Ausdruck von Einschränkungen ererbt.
Zurück zu unseren beiden oben genannten Sätzen, nachdem wir diese Aufgaben beendet hatten
Wählen Sie * vom Benutzer, wobei Name = 'Shun' '
Eine solche Aussage. (Hier ist die Tabelle, die der Benutzerklasse in unserer Zuordnungsdatei entspricht, die Benutzertabelle, und das Namensattribut entspricht dem Namen des Namens.)
Beschränkungen haben auch viele Methoden, um uns bei der Erstellung von SQL -Aussagen zu unterstützen. Nach der API ist es leicht zu verstehen.
Lassen Sie uns den obigen Code wieder aussehen. Wenn wir die Sitzung schließen, aber diese Kriterien weiterhin verwenden möchten, ist das in Ordnung? Schauen wir uns an.
Nach dem obigen Code übertrieben wir uns erneut und fügen hinzu:
Listlist2 = criteria.list (); Iterator iter2 = list.Iterator (); while (iter.hasnext ()) {user user = (user) iter.next (); System.out.println (user.getName ()+":"+user.getage ()); } Um den Unterschied zwischen der vorherigen Liste und der ITER zu unterscheiden, verwenden wir hier einen anderen.
Führen Sie es aus und wir erhalten eine Ausnahme:
org.hiberNate.SessionException: Session ist geschlossen!
Diese Ausnahme zu berichten bedeutet, dass die Sitzung geschlossen wurde. In vielen Fällen werden wir nach dem Schließen der Sitzung und dann in Bezug auf SaveORUpdate, Save usw. ähnliche Ausnahmen melden und dann Operationen ausführen.
Hibernate3 berücksichtigt unsere Bedürfnisse und implementiert eine Abteilungskiterie, die unabhängig von der Sitzung existieren kann.
Schauen wir uns das Beispiel an: (Entität ist noch oben)
public static void main (string [] args) {configuration cfg = new configuration (). configure (); SessionFactory SessionFactory = cfg.buildSessionFactory (); Session Session = SessionFactory.openSession (); DetachedCriteria decriteria = seetachedCriteria.forclass (user.class); DECRITRIERIA.ADD (Restriktions.Eq ("Name", "Shun"); Listlistliste = DECRIRIERIA.GetexecutableCriteria (Sitzung) .List (); Iterator iter = list.Iterator (); while (iter.hasnext ()) {user user = (user) iter.next (); System.out.println (user.getName ()+":"+user.getage ()); } Session.close (); Session Session2 = SessionFactory.openSession (); List LIST2 = DECRIRIERIA.GETEXECUTABLECRITERIA (Session2) .List (); Iterator iter2 = list2.Iterator (); while (iter2.hasnext ()) {user user = (user) iter2.next (); System.out.println (user.getName ()+":"+user.getage ()); }} Wir sehen, dass wir nach der Schließung der Sitzung weiterhin eine Abteilung in einer anderen Verbindung verwenden können. Wir müssen die aktuelle Abteilungsportriterie mit einer bestimmten Sitzung über GetExecutableCriteria (Sitzungssitzung) in Verbindung bringen.
Schauen wir uns als nächstes einen Blick auf die Kombination der Unterabschnittsklassen und Abteilungsportierer an:
public static void main (string [] args) {configuration cfg = new configuration (). configure (); SessionFactory SessionFactory = cfg.buildSessionFactory (); Session Session = SessionFactory.openSession (); DetachedCriteria decriteria = seetachedCriteria.forclass (user.class); DECRIRiteria.SetProjection (projections.avg ("Alter")); Kriterienkriterien = Sitzung.Createcriteria (user.class); Kriterien. Listlist = criteria.list (); Iterator iter = list.Iterator (); while (iter.hasnext ()) {user user = (user) iter.next (); System.out.println (user.getName ()+":"+user.getage ()); } Session.close (); } Ich denke, der erste Code -Satz, den Sie Fragen haben:
DECRIRiteria.SetProjection (projections.avg ("Alter")); Dieser Code bezieht sich auf die Erlangung des Durchschnittswerts des Alters durch Decriteria. Holen Sie sich das Objekt mit einem Alter größer als dem nachstehenden Durchschnittswert.
Projektionen enthalten viele Kapselungsmethoden, die SQL -Methoden implementieren. Sie können sich die API ansehen.
Lassen Sie uns etwas über die etwas fortgeschrittenere Nutzung erfahren.
Schauen Sie sich einfach den Code an:
Kriterien.SetFirstresult (10); Kriterien.SetMaxResults (20);
Hier setzen wir den Anfangssatz als Artikel 10 und finden dann 20 Datensätze aus Artikel 10. Nach dieser Praxis können wir die Basis -Paging -Funktion implementieren.
Natürlich müssen wir in vielen Fällen sortieren, und Kriterien unterstützen es auch:
Kriterien.Addorder (order.desc ("Alter")); Hier können wir die Addorder -Methode direkt verwenden und ein Auftragsobjekt über order.desc erhalten, für das ein Attributparameter erforderlich ist. Wenn wir Addorder anrufen, hilft uns Hibernate, eine solche Erklärung nach Alter zu erstellen.
Wie machen wir das, wenn wir es gruppieren müssen? Dies erfordert die Groupproperty -Methode der Projektionenklasse, die wir beim letzten Mal erwähnt haben.
Kriterien.
Hier gruppieren wir uns nach dem Altersattribut, das tatsächlich durch das Feldalter gruppiert wird, das dem Alter entspricht. Hibernate wandelt es automatisch in eine Aussage wie Gruppe nach Alter um.
Es gibt viele praktische Methoden in Projektionen (beachten Sie, dass dies erst nach dem Hibernate 3 verfügbar ist).