|
|
Publicerad på 2017-08-09 14:26:13
|
|
|

Låt oss nu säga att det finns en studentklass med id-, namn- och åldersattribut Sträng hql = "från Student s"; Som vi brukade göra, brukar vi göra det Query query = session.createQuery(hql); Eller om du vill söka efter villkoren. Sträng hql = "från Student s där s.name som 'King%'" Query query = session.createQuery(hql); Om du använder QBC istället för HQL, så är koden: Kriterier =session.createCriteria(Student.class); Kriterium kriterium = Uttryck.lika("namn","kung%"); Jag kan inte se det så här. Sedan lägger vi till sökvillkoret till åldern 22.
HQL: Sträng hql = "från Student s där s.name som 'Wang%' och s.age= 22 "; Query query = session.createQuery(hql); List list = query.list();
QBC: Kriterier =session.createCriteria(Student.class); Kriterium kriterium1 = Uttryck.lik("namn","kung%"); Kriterium kriterium2 = Uttryck.eq("ålder",nyttHeltal(22)); criteria.add(kriterium1).add(kriterium2); Listlista = criteria.list();
Det ser mycket mer otympligt ut. Men alla som har gjort ett projekt vet att när en moduls affärslogik ändras måste den ofta skriva om SQL, och det mest irriterande och irriterande är att ta någon annans HQL eller SQL. Om du använder QBC ökar det läsbarheten och underhållet av koden avsevärt. Det är viktigt att notera att nullvärdet är värdet Till exempel, när vi vill hitta ett Student-objekt med ett nullnamn, bör vi skriva det så här Kriterier =session.createCriteria(Student.class); Kriterium kriterium = Expression.isNull("name"); criteria.add(criterion).list(); och använda mellan... och tid Kriterier =session.createCriteria(Student.class); Kriterium kriterium1 = Expression.ge("ålder", nytt heltal(20)); Nedre gräns Kriterium kriterium2 = Uttryck.le("ålder",nytt heltal(25)); Tak
//这里也可以把上述两个条件添加到第三个条件里 Kriterium kriterium3 =Uttryck.och(kriterium1,kriterium2); criteria.add(criterion3).list(); Motsvarar från studenter där åldern är mellan 20 och 25 år Ekvivalent med från Student s där s.age >= 20 och s.age <=25
Följande är en jämförelse av de vanligt använda frågevillkoren för HQL och QBC Uttryck som betyder HQL QBC större än eller lika med > = Expression.ge() Större än > Expression.gt() Mindre än eller lika med < = Expression.le() Mindre än < Expression.lt() equals = Expression.eq() är inte lika med <>eller!= Expression.ne()
Null är null Expression.isNull() är notnull Expression.isNotNull() Inom det angivna intervallet mellan och Expression.between() Inte inom det angivna intervallet inte mellan och Expression.not(Expression.between()) Tillhör en samling i Expression.in() Inte en del av en samling notin Expression.not(Expression.in()) och expression.and() eller Expression.or() Inte Expression.not() Fuzzy query som Expression.like
1. Skapa en Criteria-instans net.sf.hibernate.Criteria Detta gränssnitt representerar en fråga för en specifik persistensklass. Session är fabriken som används för att tillverka Criteria-instansen.
Kriterier crit = sess.createCriteria(Cat.class);
crit.setMaxResults(50);
List cats = crit.list();
2. Begränsa omfattningen av resultatmängden Ett frågevillkor (Criterion) är en instans av gränssnittet net.sf.hibernate.expression.Criterion. Klassen net.sf.hibernate.expression.Expression definierar för att få vissa inbyggda Criterion-typer.
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("name", "Fritz%") )
.add( Expression.between("vikt", minWeight, maxWeight))
.list(); Uttryck kan grupperas logiskt.
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("name", "Fritz%") )
.add( Expression.or( Expression.eq( "age", new Integer(0) ), Expression.isNull("age")))
.list();
List cats = sess.createCriteria(Cat.class)
.add( Expression.in( "name",new String[]{"Fritz","Izi","Pk"}))
.add( Expression.disjunktion()
.add( Expression.isNull("age") )
.add( Expression.eq("age", ny Integer(0) ) )
.add( Expression.eq("age", new Integer(1) ) )
.add( Expression.eq("age", ny heltal (2) ) ) ) )
.list(); Det finns många förgjorda villkorstyper (underklasser av uttryck). Det finns en särskilt användbar som låter dig bädda in SQL direkt.
List cats = sess.createCriteria(Cat.class)
.add( Expression.sql("lower($alias.name) like lower(?)", "Fritz%", Hibernate.STRING))
.list(); där {alias} är en platshållare, kommer den att ersättas av radaliaset för den efterfrågade enheten. (Original: {alias}-platshållaren måste ersättas av radaliaset för den efterfrågade enheten.)
3. Sortera resultaten Du kan använda net.sf.hibernate.expression.Order för att sortera resultatmängden.
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("name", "F%")
.addOrder( Order.asc("name"))
.addOrder( Order.desc("age"))
.setMaxResults(50)
.list();
4. Associationer Du kan använda createCriteria() mellan associationer för att enkelt specificera begränsningar mellan entiteter med relationer.
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("name", "F%")
.createCriteria("kittens")
.add( Expression.like("name","F%")
.list();
Observera att den andra createCriteria() returnerar en ny instans av Criteria, som pekar på ett element i kattungens samlingsklass. Följande alternativa former är användbara i specifika situationer.
List cats = sess.createCriteria(Cat.class)
.createAlias("kittens", "kt")
.createAlias("mate", "mt")
.add(Expression.eqProperty("kt.name", "mt.name"))
.list();
(createAlias()) skapar inte en ny instans av Criteria. Observera att kattungesamlingsklassen som hålls av Cat-instansen i de två föregående frågorna inte är förfiltrerad av kriterier! Om du vill returnera endast kattungar som uppfyller kriterierna måste du använda returnMaps().
List cats = sess.createCriteria(Cat.class)
.createCriteria("kittens", "kt")
.add( Expression.eq("name", "F%") )
.returnMaps()
.list();
Iterator iter = cats.iterator();
medan (iter.hasNext())
{
Map map = (Map) iter.next();
Cat cat = (Cat) map.get(Criteria.ROOT_ALIAS);
Cat kitten = (Cat) map.get("kt");
}
5. Dynamisk kopplingshämtning Du kan ändra den automatiska hämtningspolicyn för associationsobjekt genom att sätta FetchMode() vid körning.
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("name", "Fritz%") )
.setFetchMode("mate", FetchMode.EAGER)
.list();
Denna fråga kommer att få både partner och kattungar via yttre anslutning.
6. Enligt klassen Example queries net.sf.hibernate.expression.example, kan du skapa frågevillkor från den angivna instansen.
Katt = ny katt (KATT();
cat.setSex('F');
cat.setColor(Color.BLACK);
Listaresultat = session.createCriteria(Cat.class)
.add( Example.create(cat) )
.list(); Versionsegenskaper, representationsegenskaper och associationer ignoreras alla. Som standard är även nullattribut uteslutna. Du kan justera hur exemplet används. Du kan för att justera hur exemplet tillämpas. Exempel exempel = Example.create(cat) .exludeZeroes() //uteslut nollvärda egenskaper
.exludeProperty("color") //uteslut egenskapen "color" .ignoreCase() //utför jämförelser av veräustivt känsliga strängar
.enableLike(); Användning av Like för strängjämförelser
Listaresultat = session.createCriteria(Cat.class)
.add(exempel)
.list(); Du kan till och med använda exempel för att fastställa kriterier för associerade objekt. Listresultat = session.createCriteria(Cat.class) .add(Example.create(cat) )
.createCriteria("mate"), .add(Example.create(cat.getMate())) .list();
Referenskoden är följande:
|
Föregående:LINQ vänster, höger och inre anslutningarNästa:Skillnaden mellan let och var-definitionsvariabler i js
|