Zdaj recimo, da obstaja razred Študent z atributi ID, Ime, Starost Niz hql = "od študenta s"; Kot smo včasih počeli, tudi običajno Query query = session.createQuery(hql); Ali pa če želite iskati glede na pogoje. String hql = "from Student s, kjer s.name kot 'King%'" Query query = session.createQuery(hql); Če uporabljate QBC namesto HQL, je koda: Kriteriji =session.createCriteria(Študent.razred); Kriterij = Expression.like("ime","kralj%"); Ne morem si tega predstavljati tako. Nato pogoj iskanja dodamo starosti 22 let.
HQL: Niz hql = "od študenta s, kjer s.name kot 'Wang%' in s.age = 22 "; Query query = session.createQuery(hql); List list = query.list();
QBC: Kriteriji =session.createCriteria(Študent.razred); Kriterij 1 = Expression.like("ime","kralj%"); Kriterij 2 = Expression.eq("starost",newInteger(22)); criterion.add(criterion1).add(criterion2); List list = criterion.list();
Zdi se veliko bolj nerodno. A vsak, ki je delal projekt, ve, da ko se poslovna logika modula spremeni, mora pogosto prepisati SQL, in najbolj nadležno in nadležno je, da prevzameš tuji HQL ali SQL. Če uporabljate QBC, to močno poveča berljivost in vzdržljivost kode. Pomembno je poudariti, da je ničelna vrednost vrednost Na primer, ko želimo najti objekt Student z ničelnim imenom, ga moramo zapisati takole Kriteriji =session.createCriteria(Študent.razred); Kriterij = Expression.isNull("ime"); kriterij.add(criterion).list(); in uporaba vmes... in čas Kriteriji =session.createCriteria(Študent.razred); Kriterij 1 = Expression.ge("starost", novo celo število(20)); Spodnja meja Kriterij 2 = Expression.le("starost",novo celo število(25)); Strop
//这里也可以把上述两个条件添加到第三个条件里 Kriterij 3 =Izraz.and(kriterij1,kriterij2); criterion.add(criterion3).list(); Enakovredno kot pri učencih, ki so stari med 20 in 25 let. Enako kot od učenca s, kjer je s.starost >= 20 in s.starost <=25
Naslednje je primerjava pogosto uporabljenih pogojev poizvedb za HQL in QBC Pomen izraza HQL QBC večje ali enako > = Expression.ge() Več kot > Expression.gt() Manj ali enako < = Expression.le() Manj kot < Expression.lt() enak = Expression.eq() ni enako <>ali!= Expression.ne()
Null je null Expression.isNull() je notnull Expression.isNotNull() V določenem območju med in Expression.between() Ne v določenem območju not betweenin in Expression.not(Expression.between()) Pripada zbirki v Expression.in() Ni del zbirke notin Expression.not(Expression.in()) in expression.and() ali Expression.or() Not Expression.not() Nejasna poizvedba kot Expression.like
1. Ustvarite primer kriterija net.sf.hibernate.Criteria Ta vmesnik predstavlja poizvedbo za določen razred trajnosti. Session je tovarna, ki se uporablja za izdelavo primerka Kriterijev.
Kriterij crit = sess.createCriteria(Cat.class);
crit.setMaxResults(50);
List cats = crit.list();
2. Zožite obseg množice rezultatov Pogoj poizvedbe (Criterion) je primer vmesnika net.sf.hibernate.expression.Criterion. Razred net.sf.hibernate.expression.Expression definira, da pridobi nekatere vgrajene tipe kriterijev.
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("ime", "Fritz%") )
.add( Expression.between("weight", minWeight, maxWeight))
.list(); Izraze je mogoče logično združevati.
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("ime", "Fritz%") )
.add( Expression.or( Expression.eq( "starost", novo celo število(0) ), Expression.isNull("starost")))
.list();
List cats = sess.createCriteria(Cat.class)
.add( Expression.in( "ime",novi niz[]{"Fritz","Izi","Pk"}))
.add( Expression.disjunction()
.add( Expression.isNull("starost") )
.add( Expression.eq("age", novo celo število(0) ) )
.add( Expression.eq("starost", novo celo število(1) ) )
.add( Expression.eq("starost", novo celo število(2) ) ) ) )
.list(); Obstaja veliko vnaprej pripravljenih vrst pogojev (podrazredov izrazov). Obstaja še posebej uporaben način, ki omogoča neposredno vgradnjo SQL.
List cats = sess.createCriteria(Cat.class)
.add( Expression.sql("lower($alias.name) like lower(?)", "Fritz%", Hibernate.STRING))
.list(); kjer je {alias} začasni element, ga nadomesti alias vrstice poizvedbene entitete. (Izvirno: Nadomestek {alias} z bo zamenjan z vrsticnim aliasom poizvedbene entitete.)
3. Razvrstite rezultate Za razvrščanje množice rezultatov lahko uporabite net.sf.hibernate.expression.Order.
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("ime", "F%")
.addOrder( Order.asc("ime"))
.addOrder( Order.desc("age"))
.setMaxResults(50)
.list();
4. Povezave Lahko uporabite createCriteria() med povezavami za enostavno določitev omejitev med entitetami z relacijami.
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("ime", "F%")
.createCriteria("mucki")
.add( Expression.like("ime","F%")
.list();
Upoštevajte, da drugi createCriteria() vrne novo instanco Kriterija, ki kaže na element razreda zbirke muckov. Naslednje alternativne oblike so uporabne v specifičnih situacijah.
List cats = sess.createCriteria(Cat.class)
.createAlias("mucke", "kt")
.createAlias("mate", "mt")
.add(Expression.eqProperty("kt.name", "mt.name"))
.list();
(createAlias()) ne ustvari nove instance kriterijev. Upoštevajte, da razred zbirke muck, ki ga ima instanca Cat v prejšnjih dveh poizvedbah, ni vnaprej filtriran po kriterijih! Če želite vrniti le mladičke, ki izpolnjujejo kriterije, morate uporabiti returnMaps().
List cats = sess.createCriteria(Cat.class)
.createCriteria("mucke", "kt")
.add( Expression.eq("ime", "F%") )
.returnMaps()
.list();
Iterator iter = cats.iterator();
medtem ko (iter.hasNext())
{
Map map = (Map) iter.next();
Cat cat = (Cat) map.get(Criteria.ROOT_ALIAS);
Mačji mucek = (Mačka) map.get("kt");
}
5. Dinamično pridobivanje asociacij Samodejno politiko pridobivanja asociacijskih objektov lahko spremenite tako, da med izvajanjem nastavite FetchMode().
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("ime", "Fritz%") )
.setFetchMode("mate", FetchMode.EAGER)
.list();
Ta poizvedba bo preko zunanjega združevanja pritegnila tako partnerja kot mladiče.
6. Po vzorčnih poizvedbah net.sf.hibernate.expression.example lahko ustvarite pogoje poizvedbe iz določene instance.
Cat cat = nova Cat();
cat.setSex('F');
cat.setColor(Color.BLACK);
List results = session.createCriteria(Cat.class)
.add( Example.create(cat) )
.list(); Lastnosti različic, lastnosti predstavitve in povezave so vse prezrte. Privzeto so izključeni tudi ničelni atributi. Lahko prilagodite, kako se primer uporablja. Ti lahko za prilagoditev uporabe primera. Primer = Example.create(cat) .excludeZeroes() //izključi lastnosti z ničelno vrednostjo
.excludeProperty("color") //izključi lastnost z imenom "color" .ignoreCase() //izvajaj primerjave nizov, ki niso občutljive na primere
.enableLike(); Uporaba like za primerjavo nizov
List results = session.createCriteria(Cat.class)
.add(example)
.list(); Primere lahko celo uporabite za določitev kriterijev za povezane predmete. List results = session.createCriteria(Cat.class) .add(Example.create(cat) )
.createCriteria("mate") .add(Example.create(cat.getMate())) .list();
Referenčna koda je naslednja:
|