Nehmen wir nun an, es gibt eine Studentenklasse mit ID-, Name- und Altersattributen String hql = "von Student s"; Wie früher tun wir es auch meistens Abfrage = session.createQuery(hql); Oder wenn du nach den Bedingungen suchen möchtest. String hql = "von Student s, wo s.name wie 'King%'" Abfrage = session.createQuery(hql); Wenn Sie QBC statt HQL verwenden, lautet der Code: Kriterien =session.createCriteria(Student.class); Kriterium = Expression.like("name","king%"); So kann ich es mir nicht vorstellen. Dann addieren wir die Suchbedingung auf das Alter von 22 Jahren.
HQL: Saite hql = "aus Student s, wobei s.name wie 'Wang%' und s.age = 22 "; Abfrage = session.createQuery(hql); List List = query.list();
QBC: Kriterien =session.createCriteria(Student.class); Kriterium Kriterium1 = Ausdruck.wie("name","king%"); Kriterium Kriterium2 = Expression.eq("age",newInteger(22)); criteria.add(kriterium1).add(criterion2); Liste = criteria.list();
Es sieht viel umständlicher aus. Aber jeder, der ein Projekt gemacht hat, weiß, dass wenn sich die Geschäftslogik eines Moduls ändert, es oft SQL neu schreiben muss, und das Nervigste und Nervigste ist, das HQL oder SQL von jemand anderem zu übernehmen. Wenn du QBC verwendest, erhöht das die Lesbarkeit und Wartbarkeit des Codes erheblich. Es ist wichtig zu beachten, dass der Nullwert der Wert ist Wenn wir zum Beispiel ein Student-Objekt mit einem Nullnamen finden wollen, sollten wir es so schreiben Kriterien =session.createCriteria(Student.class); Kriterium = Expression.isNull("name"); criteria.add(criterion).list(); und benutzt zwischen... und Zeit Kriterien =session.createCriteria(Student.class); Kriterium Kriterium1 = Expression.ge("Alter", neue Ganzzahl(20)); Untere Grenze Kriterium Kriterium2 = Ausdruck.le("alter",neue Ganzzahl(25)); Decke
//这里也可以把上述两个条件添加到第三个条件里 Kriterium Kriterium3 =Ausdruck.und(Kriterium1,Kriterium2); criteria.add(criterion3).list(); Entspricht von Schülern im Alter zwischen 20 und 25 Äquivalent zu from Student s, wobei s.age >= 20 und s.age <=25
Im Folgenden ist ein Vergleich der häufig verwendeten Abfragebedingungen von HQL und QBC aufgeführt Ausdruck, der HQL QBC bedeutet größer als oder gleich > = Expression.ge() Größer als > Expression.gt() Weniger als oder gleich < = Expression.le() Weniger als < Expression.lt() gleich = Expression.eq() ist nicht gleich <>oder!= Expression.ne()
Null ist null Expression.isNull() is notnull Expression.isNotNull() Innerhalb des angegebenen Bereichs zwischen und Expression.between() Nicht im angegebenen Bereich, nicht zwischen und Expression.not(Expression.between()) Gehört zu einer Sammlung in Expression.in() Nicht Teil einer Sammlung notin Expression.not(Expression.in()) und Ausdruck. und() oder Expression.or() Not Expression.not() Fuzzy Query wie Expression.like
1. Erstellen Sie eine Kriterien-Instanz net.sf.hibernate.Criteria Diese Schnittstelle stellt eine Abfrage für eine bestimmte Persistenzklasse dar. Session ist die Fabrik, die zur Herstellung der Kriterieninstanz verwendet wird.
Kriterium krit = sess.createCriteria(Cat.class);
crit.setMaxResults(50);
List Cats = crit.list();
2. Verengen Sie den Anwendungsbereich der Ergebnismenge Eine Abfragebedingung (Criterion) ist eine Instanz der net.sf.hibernate.expression.Criterion-Schnittstelle. Die Klasse net.sf.hibernate.expression.Expression definiert, um einige eingebaute Kriteriumstypen zu erhalten.
Liste Katzen = sess.createCriteria(Cat.class)
.add( Expression.like("name", "Fritz%") )
.add( Expression.between("weight", minWeight, maxWeight))
.list(); Ausdrücke können logisch gruppiert werden.
Liste Katzen = sess.createCriteria(Cat.class)
.add( Expression.like("name", "Fritz%") )
.add( Expression.or( Expression.eq( "age", new Integer(0) ), Expression.isNull("age")))
.list();
Liste Katzen = sess.createCriteria(Cat.class)
.add( Expression.in( "name",new String[]{"Fritz","Izi","Pk"}))
.add( Expression.disjunktion()
.add( Expression.isNull("age") )
.add( Expression.eq("age", neue Integer(0) ) )
.add( Expression.eq("age", neue Integer(1) ) )
.add( Expression.eq("age", neue Integer(2) ) ) )
.list(); Es gibt viele vorgefertigte Konditionstypen (Unterklassen von Ausdrücken). Es gibt eine besonders nützliche Methode, die es ermöglicht, SQL direkt einzubetten.
Liste Katzen = sess.createCriteria(Cat.class)
.add( Expression.sql("lower($alias.name) like lower(?)", "Fritz%", Hibernate.STRING))
.list(); wobei {alias} ein Platzhalter ist, wird er durch das Zeilenalias der abgerufenen Entität ersetzt. (Original: Der {alias}-Platzhalter wird durch den Zeilenalias der abgefragten Entität ersetzt.)
3. Sortiere die Ergebnisse Du kannst net.sf.hibernate.expression.Order verwenden, um die Ergebnismenge zu sortieren.
Liste Katzen = sess.createCriteria(Cat.class)
.add( Expression.like("name", "F%")
.addOrder( Order.asc("name"))
.addOrder( Order.desc("age"))
.setMaxResults(50)
.list();
4. Assoziationen Du kannst createCriteria() zwischen Assoziationen verwenden, um einfach Einschränkungen zwischen Entitäten mit Beziehungen zu spezifizieren.
Liste Katzen = sess.createCriteria(Cat.class)
.add( Expression.like("name", "F%")
.createCriteria("kittens")
.add( Expression.like("name","F%")
.list();
Beachten Sie, dass die zweite createCriteria() eine neue Instanz von Criteria zurückgibt, die auf ein Element der Kittens-Sammlungsklasse verweist. Die folgenden alternativen Formen sind in bestimmten Situationen nützlich.
Liste Katzen = sess.createCriteria(Cat.class)
.createAlias("kittens", "kt")
.createAlias("mate", "mt")
.add(Expression.eqProperty("kt.name", "mt.name"))
.list();
(createAlias()) erzeugt keine neue Instanz der Kriterien. Beachten Sie, dass die Kittens-Sammlungsklasse, die in den beiden vorherigen Abfragen von der Cat-Instanz gehalten wurde, nicht durch Kriterien vorgefiltert ist! Wenn Sie nur Kätzchen zurückgeben möchten, die die Kriterien erfüllen, müssen Sie returnMaps() verwenden.
Liste Katzen = sess.createCriteria(Cat.class)
.createCriteria("kittens", "kt")
.add( Expression.eq("name", "F%") )
.returnMaps()
.list();
Iterator iter = cats.iterator();
während ( iter.hasNext())
{
Map map = (Map) iter.next();
Katze, Katze = (Katze) map.get(Criteria.ROOT_ALIAS);
Katzenkätzchen = (Katze) map.get("kt");
}
5. Dynamisches Assoziations-Fetching Sie können die automatische Abrufrichtlinie von Assoziationsobjekten ändern, indem Sie FetchMode() zur Laufzeit setzen.
Liste Katzen = sess.createCriteria(Cat.class)
.add( Expression.like("name", "Fritz%") )
.setFetchMode("mate", FetchMode.EAGER)
.list();
Diese Abfrage bewirkt sowohl Partner als auch Kätzchen über die äußere Verbindung.
6. Laut der Example Queries net.sf.hibernate.expression.Example-Klasse können Sie Anfragebedingungen aus der angegebenen Instanz erstellen.
Katze = neue Katze();
cat.setSex('F');
cat.setFarbe(Farbe.SCHWARZ);
Listenergebnisse = session.createCriteria(Cat.class)
.add( Example.create(cat) )
.list(); Versionseigenschaften, Darstellungseigenschaften und Assoziationen werden alle ignoriert. Standardmäßig sind auch Nullattribute ausgeschlossen. Du kannst anpassen, wie das Beispiel angewendet wird. Sie können um anzupassen, wie das Beispiel angewendet wird. Beispiel = Example.create(cat) .exludeZeroes() //exclude nullwertige Eigenschaften aus
.excludeProperty("color") //exclude die Eigenschaft namens "color" .ignoreCase() //führen String-Vergleiche ohne Großfach aus
.enableLike(); Verwendung wie für Saitenvergleiche
Listenergebnisse = session.createCriteria(Cat.class)
.add(example)
.list(); Sie können sogar Beispiele verwenden, um Kriterien für zugehörige Objekte festzulegen. Listenergebnisse = session.createCriteria(Cat.class) .add(Example.create(cat) )
.createCriteria("mate"), .add(Example.create(cat.getMate())) .list();
Der Referenzcode lautet wie folgt:
|