Oletame nüüd, et on õpilasklass, millel on id, nimi ja vanuseomadused String hql = "õpilasest s"; Nagu varem, teeme seda tavaliselt Query query = session.createQuery(hql); Või kui soovid otsida vastavalt tingimustele. String hql = "õpilastest, kus s.name nagu 'King%'" Query query = session.createQuery(hql); Kui kasutad QBC-d HQL-i asemel, siis kood on järgmine: Kriteeriumid =session.createCriteria(Student.class); Kriteeriumi kriteerium = Väljend.like("nimi","kuningas%"); Ma ei suuda seda nii näha. Seejärel lisame otsingutingimuse vanusele 22.
HQL: String hql = "õpilastest s, kus s.name nagu 'Wang%' ja s.age= 22 "; Query query = session.createQuery(hql); List list = query.list();
QBC: Kriteeriumid =session.createCriteria(Student.class); Kriteerium kriteerium1 = Väljend.like("nimi","kuningas%"); Kriteerium kriteerium2 = Avaldis.eq("vanus",newInteger(22)); criteria.add(kriteerium1).add(kriteerium2); List list = criteria.list();
See näeb palju kohmakam välja. Aga igaüks, kes on projekti teinud, teab, et kui mooduli äriloogika muutub, tuleb tihti SQL-i ümber kirjutada, ja kõige tüütum ja tüütum on võtta kellegi teise HQL või SQL. Kui kasutad QBC-d, suurendab see oluliselt koodi loetavust ja hooldatavust. Oluline on märkida, et nullväärtus on väärtus Näiteks, kui tahame leida Studenti objekti nullnimega, peaksime selle kirjutama nii Kriteeriumid =session.createCriteria(Student.class); Kriteeriumi kriteerium = Expression.isNull("nimi"); criteria.add(criterion).list(); ja kasutades vahepeal... ja aeg Kriteeriumid =session.createCriteria(Student.class); Kriteerium1 = Expression.ge("vanus", uus täisarv(20)); Alumine piir Kriteerium2 = Avaldis.le("vanus",uus täisarv(25)); Lagi
//这里也可以把上述两个条件添加到第三个条件里 Kriteerium kriteerium 3 = Avaldis.and(kriteerium 1,kriteerium2); criteria.add(criterion3).list(); Võrdväärne õpilaste s-ga, kus vanuses on 20–25 Võrdväärne õpilastest s, kus s.vanus >= 20 ja s.vanus <=25
Järgnevalt on toodud HQL-i ja QBC laialdaselt kasutatavate päringutingimuste võrdlus Väljend, mis tähendab HQL QBC suurem või võrdne > = Expression.ge() Rohkem kui > Expression.gt() Väiksem või võrdne < = Expression.le() Vähem kui < Expression.lt() võrdub = Avaldis.eq() ei võrdu <>või!= Expression.ne()
Null on null Expression.isNull() is notnull Expression.isNotNull() Määratud vahemikus Expression.between() vahel Mitte määratud vahemikus mitte-betweenand Expression.not(Expression.between()) Kuulumine Expression.in() kollektsiooni Ei kuulu kogumiku hulka, notin Expression.not(Expression.in()) ja väljendus.and() või Expression.or() Not Expression.not() Hägune päring nagu Expression.like
1. Loo Criteria instance net.sf.hibernate.Criteria See liides esindab päringut konkreetse püsivusklassi kohta. Session on tehas, mida kasutatakse Criteria instantsi tootmiseksemplariks.
Kriteerium: kriitiline = sess.createCriteria(Cat.class);
crit.setMaxResults(50);
List cats = crit.list();
2. Kitsenda tulemuste hulga ulatust Päringutingimus (Criterion) on net.sf.hibernate.expression.Criterion liidese eksemplar. Klass net.sf.hibernate.expression.Expression defineerib, et saada mõned sisseehitatud Criterion tüübid.
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("name", "Fritz%") )
.add( Expression.between("weight", minWeight, maxWeight))
.list(); Avaldisi saab loogiliselt grupeerida.
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("name", "Fritz%") )
.add( Expression.or( Expression.eq( "vanus", uus täisarv(0)), Expression.isNull("vanus"))
.list();
List cats = sess.createCriteria(Cat.class)
.add( Expression.in( "name",new String[]{"Fritz","Izi","Pk"}))
.add( Expression.disjunction()
.add( Expression.isNull("vanus") )
.add( Expression.eq("vanus", uus täisarv(0)) )
.add( Expression.eq("vanus", uus täisarv(1)) )
.add( Expression.eq("vanus", uus täisarvu(2)) ) ) )
.list(); On palju eelvalmistatud tingimustüüpe (avaldiste alamklassid). On olemas eriti kasulik lahendus, mis võimaldab SQL-i otse manustada.
List cats = sess.createCriteria(Cat.class)
.add( Expression.sql("lower($alias.name) nagu lower(?)", "Fritz%", Hibernate.STRING))
.list(); kui {alias} on ajutine, asendatakse see päringu objekti rea alias'ega. (Originaal: {alias} kohatäitja asendatakse päringu objekti rea aliasega.)
3. Sorteeri tulemused Tulemuste sorteerimiseks saad kasutada net.sf.hibernate.expression.Order.
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("name", "F%")
.addOrder( Order.asc("name"))
.addOrder( Order.desc("age"))
.setMaxResults(50)
.list();
4. Seosed Saad kasutada createCriteria() seoste vahel, et hõlpsasti määratleda piiranguid suhetega üksuste vahel.
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("name", "F%")
.createCriteria("kassipojad")
.add( Expression.like("name","F%")
.list();
Pane tähele, et teine createCriteria() tagastab uue Criteria'i eksemplari, osutades kassikogumise klassi elemendile. Järgmised alternatiivsed vormid on kasulikud konkreetsetes olukordades.
List cats = sess.createCriteria(Cat.class)
.createAlias("kassipojad", "kt")
.createAlias("mate", "mt")
.add(Expression.eqProperty("kt.name", "mt.name"))
.list();
(createAlias()) ei loo uut Kriteeriumi eksemplari. Pane tähele, et kassipoegade kogumise klass, mida Cat instants eelnevates kahes päringus hoiab, ei ole eelfiltreeritud kriteeriumite järgi! Kui soovid tagastada ainult kassipoegi, kes vastavad kriteeriumidele, pead kasutama returnMaps().
List cats = sess.createCriteria(Cat.class)
.createCriteria("kassipojad", "kt")
.add( Expression.eq("name", "F%") )
.returnMaps()
.list();
Iterator iter = cats.iterator();
while ( iter.hasNext())
{
Kaardikaart = (Kaart) iter.next();
Kass kass = (Kass) map.get(Criteria.ROOT_ALIAS);
Kassipoeg = (Kass) map.get("kt");
}
5. Dünaamiline assotsiatsiooni toomine Saad muuta assotsiatsiooniobjektide automaatse toomise poliitikat, seadistades käitusajal FetchMode().
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("name", "Fritz%") )
.setFetchMode("mate", FetchMode.EAGER)
.list();
See päring toob nii paarilised kui kassipojad välisühenduse kaudu.
6. Vastavalt Sample queries net.sf.hibernate.expression.Example klassile saab määratud eksemplarist luua päringutingimusi.
Kass kass = uus kass();
cat.setSugu ('F');
cat.setColor (Color.BLACK);
Listi tulemused = session.createCriteria(Cat.class)
.add( Example.create(cat) )
.list(); Versiooni omadused, esitusomadused ja seosed jäetakse kõik tähelepanuta. Vaikimisi on nullatribuudid samuti välistatud. Saad kohandada, kuidas näidet rakendatakse. Sa saad et kohandada, kuidas näidet rakendatakse. Näide = Example.create(cat) .excludeZeroes() //exclude nullväärtuslikud omadused
.excludeProperty("color") //exclude omadus nimega "color" .ignoreCase() //tee käänbutundlikke stringide võrdlusi
.enableLike(); Kasuta nagu keele võrdluseks
Listi tulemused = session.createCriteria(Cat.class)
.add (näide)
.list(); Sa võid isegi kasutada näiteid, et määrata seotud objektide kriteeriumid. Loendi tulemused = session.createCriteria(Cat.class) .add(Example.create(cat))
.createCriteria("mate") .add(Example.create(cat.getMate())) .list();
Viitekood on järgmine:
|