|
|
Opslået på 09/08/2017 14.26.13
|
|
|

Lad os nu sige, at der findes en Student-klasse med id-, navn- og aldersattributter Streng hql = "fra Studerende s"; Som vi plejede, gør vi det som regel Forespørgsel = session.createQuery(hql); Eller hvis du vil søge efter betingelserne. Streng hql = "fra Student s hvor s.name som 'King%'" Forespørgsel = session.createQuery(hql); Hvis du bruger QBC i stedet for HQL, er koden: Kriterier =session.createCriteria(Student.class); Kriterium kriterium = Udtryk.som("navn","konge%"); Jeg kan ikke se det sådan her. Derefter lægger vi søgebetingelsen til alderen 22.
HQL: Streng hql = "fra Student s hvor s.name som 'Wang%' og s.age= 22 "; Forespørgsel = session.createQuery(hql); Listeliste = query.list();
QBC: Kriterier =session.createCriteria(Student.class); Kriterium kriterium1 = Udtryk.som("navn","konge%"); Kriterium kriterium2 = Udtryk.eq ("alder",nyHeltal(22)); criteria.add(kriterium1).add(kriterium2); Liste = criteria.list();
Det ser meget mere besværligt ud. Men alle, der har lavet et projekt, ved, at når et moduls forretningslogik ændres, skal det ofte omskrive SQL, og det mest irriterende og irriterende er at tage en andens HQL eller SQL. Hvis du bruger QBC, øger det læsbarheden og vedligeholdelsesevnen af koden betydeligt. Det er vigtigt at bemærke, at nulværdien er værdien For eksempel, når vi vil finde et Student-objekt med et nulnavn, bør vi skrive det sådan her Kriterier =session.createCriteria(Student.class); Kriterium kriterium = Udtryk.isNull("navn"); criteria.add(criterion).list(); og bruge mellem... og tid Kriterier =session.createCriteria(Student.class); Kriterium kriterium1 = Expression.ge("alder", nyt heltal(20)); Nedre grænse Kriterium kriterium2 = Udtryk.le("alder",nyt heltal(25)); Loft
//这里也可以把上述两个条件添加到第三个条件里 Kriterium3 =Udtryk.og(kriterium1,kriterium2); criteria.add(criterion3).list(); Svarende til fra studerende, hvor børn er mellem 20 og 25 år Ækvivalent med fra Student s, hvor s.age >= 20 og s.age <=25
Følgende er en sammenligning af de almindeligt anvendte forespørgselsbetingelser for HQL og QBC Udtryk, der betyder HQL QBC større end eller lig med > = Expression.ge() Større end > Expression.gt() Mindre end eller lig med < = Expression.le() Mindre end < Expression.lt() lig = Udtryk.eq() ikke er lig med <>eller!= Expression.ne()
Null er null Expression.isNull() er ikke-null Expression.isNotNull() Inden for det specificerede interval betweenand Expression.between() Ikke i det angivne interval ikke mellemog Expression.not(Expression.between()) Tilhørende en samling i Expression.in() Ikke en del af en samling notin Expression.not(Expression.in()) og udtryk. og() eller Expression.or() Ikke Expression.not() Fuzzy forespørgsler som Expression.like
1. Opret en Criteria-instans net.sf.hibernate.Criteria Denne grænseflade repræsenterer en forespørgsel for en specifik persistensklasse. Session er fabrikken, der bruges til at fremstille Criteria-instansen.
Kriterier crit = sess.createCriteria(Cat.class);
crit.setMaxResults(50);
Listekatte = crit.list();
2. Indsnævr omfanget af resultatmængden En forespørgselsbetingelse (Criterion) er en instans af net.sf.hibernate.expression.Criterion-grænsefladen. Klassen net.sf.hibernate.expression.Expression definerer for at få nogle indbyggede Criterion-typer.
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("name", "Fritz%") )
.add( Expression.between("weight", minWeight, maxWeight))
.list(); Udtryk kan grupperes logisk.
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", nyt Integer(0) ) )
.add( Expression.eq("age", ny Integer(1) ) )
.add( Expression.eq("age", nyt heltal (2) ) ) ) )
.list(); Der findes mange forudlavede betingelsestyper (underklasser af Udtryk). Der er en særlig nyttig en, der tillader dig at indlejre SQL direkte.
List cats = sess.createCriteria(Cat.class)
.add( Expression.sql("lower($alias.name) like lower(?)", "Fritz%", Hibernate.STRING))
.list(); hvor {alias} er en pladsholder, vil den blive erstattet af linjealiaset for den forespurgte enhed. (Original: {alias}-pladsholderen skal erstattes af rækkealiaset for den forespurgte enhed.)
3. Sorter resultaterne Du kan bruge net.sf.hibernate.expression.Order til at sortere resultatsættet.
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 bruge createCriteria() mellem associationer til nemt at specificere begrænsninger mellem enheder med relationer.
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("name", "F%")
.createCriteria("killinger")
.add( Expression.like("name","F%")
.list();
Bemærk, at den anden createCriteria() returnerer en ny instans af Criteria, som peger på et element i kittens samlingsklasse. Følgende alternative former er nyttige i specifikke situationer.
List cats = sess.createCriteria(Cat.class)
.createAlias("kittens", "kt")
.createAlias("mate", "mt")
.add(Expression.eqProperty("kt.name", "mt.name"))
.list();
(createAlias()) opretter ikke en ny instans af Criteria. Bemærk, at kittens-samlingsklassen, som Cat-instansen har i de to forespørgsler, ikke er forudfiltreret af kriterier! Hvis du kun vil returnere killinger, der opfylder kriterierne, skal du bruge returnMaps().
List cats = sess.createCriteria(Cat.class)
.createCriteria("killinger", "kt")
.add( Expression.eq("name", "F%") )
.returnMaps()
.list();
Iterator iter = cats.iterator();
mens (iter.hasNext())
{
Map map = (Map) iter.next();
Cat cat = (Cat) map.get(Criteria.ROOT_ALIAS);
Kat killing = (Kat) map.get("kt");
}
5. Dynamisk associationshentning Du kan ændre den automatiske hentningspolitik for associationsobjekter ved at sætte FetchMode() under kørsel.
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("name", "Fritz%") )
.setFetchMode("mate", FetchMode.EAGER)
.list();
Denne forespørgsel vil få både magen og killingerne via ydre sammenslutning.
6. Ifølge Example-forespørgslerne net.sf.hibernate.expression.Example-klassen kan du oprette forespørgselsbetingelser ud fra den angivne instans.
Kat kat = ny Kat();
cat.setSex('F');
cat.setColor(Color.BLACK);
Listeresultater = session.createCriteria(Cat.class)
.add( Example.create(cat) )
.list(); Versionsegenskaber, repræsentationsegenskaber og associationer ignoreres alle. Som standard er null-attributter også udelukket. Du kan justere, hvordan eksemplet anvendes. Du kan for at justere, hvordan eksemplet anvendes. Eksempel eksempel = Example.create(cat) .excludeZeroes() //exclude nulværdide egenskaber
.excludeProperty("color") //exclude egenskaben "color" .ignoreCase() //udfør case-insensitive streng-sammenligninger
.enableLike(); Brug Like til strengsammenligninger
Listeresultater = session.createCriteria(Cat.class)
.add(eksempel)
.list(); Du kan endda bruge eksempler til at fastlægge kriterier for tilknyttede objekter. Listeresultater = session.createCriteria(Cat.class) .add(Example.create(cat) )
.createCriteria("mate"), .add(Example.create(cat.getMate())) .list();
Referencekoden er som følger:
|
Tidligere:LINQ venstre, højre og indre forbindelserNæste:Forskellen mellem let og var-definitionsvariabler i js
|