|
|
Közzétéve 2017. 08. 09. 14:26:13
|
|
|

Most tegyük fel, hogy van egy diák osztály, amelynek azonosítója, neve, életkora jellemzői vannak String hql = "Student s-től"; Ahogy régen tettük, általában is így van Query query = session.createQuery(hql); Vagy ha a feltételek szerint keresel. String hql = "a Diákok s-ből, ahol s.name mint a 'King%'" Query query = session.createQuery(hql); Ha QBC-t használsz HQL helyett, akkor a kód a következő: Kritériumok =session.createCriteria(Student.class); Criterion criterion = Expression.like("name","king%"); Nem látom így a dolgot. Ezután hozzáadjuk a keresési feltételt a 22 éves korhoz.
HQL: hql hql = "a Diákok s-ből ahol s.name 'Wang%' és s.age= 22 "; Query query = session.createQuery(hql); Lista list = query.list();
QBC: Kritériumok =session.createCriteria(Student.class); Criterion criterion1 = Expression.like("name","king%"); Criterion criterion2 = Expression.eq("age",newInteger(22)); criteria.add(criterion1).add(criterion2); Lista lista = criteria.list();
Sokkal nehézebbnek tűnik. De aki már csinált projektet, tudja, hogy amikor egy modul üzleti logikája változik, gyakran át kell írnia SQL-t, és a legidegesítőbb és legbosszantóbb az, ha valaki más HQL-jét vagy SQL-jét veszi el. Ha QBC-t használsz, jelentősen növeli a kód olvashatóságát és karbantarthatóságát. Fontos megjegyezni, hogy a null érték az érték Például, amikor null nevű Student objektumot akarunk találni, így kell írnunk Kritériumok =session.createCriteria(Student.class); Criterion criterion = Expression.isNull("name"); criteria.add(criterion).list(); és a kettő között... és idő Kritériumok =session.createCriteria(Student.class); Criterion1 kritérium = Expression.ge("kor", új egész szám(20)); Alsó határ Criterion criterion2 = Expression.le("kor",új egész szám(25)); Mennyezet
//这里也可以把上述两个条件添加到第三个条件里 Criterion 3 =Expression.and(criterion1,criterion2); criteria.add(criterion3).list(); Ez megfelel a diákoknak, akik 20 és 25 év között vannak Ekvivalens a Diák s-ből, ahol s.kor >=20 és s.kor <=25
Az alábbiakban a HQL és a QBC leggyakrabban használt lekérdezési feltételeinek összehasonlítása látható Kifejezés, jelentése HQL QBC nagyobb, mint vagy egyenlő > = Expression.ge() Nagyobb, mint > Expression.gt() Kevesebb, mint vagy egyenlő < = Expression.le() Kevesebb, mint < Expression.lt() egyenlő = Expression.eq() nem egyenlő <>vagy!= Expression.ne()
Null is null Expression.isNull() is notnull Expression.isNotNull() A megadott tartományon belül Expression.between() között Nem a megadott tartományban nem betweenand Expression.not(Expression.between()) Egy gyűjteményhez tartozás Expression.in() Nem része a gyűjteménynek Expression.not(Expression.in()) és kifejezés.és() vagy Expression.or() Nem Expression.not() Fuzzy query, mint az Expression.like
1. Hozzon létre egy Criteria példányt net.sf.hibernate.Criteria Ez az interfész egy adott persistenciaosztály lekérdezését képviseli. A Session az a gyár, amelyet a Criteria példány gyártásához használnak.
Kritió kritik = sess.createCriteria(Cat.class);
crit.setMaxResults(50);
Lista macskák = crit.list();
2. Szűkítsd az eredményhalmaz hatókörét Egy lekérdezési feltétel (Criterion) a net.sf.hibernate.expression.Criterion interfész egy példánya. A net.sf.hibernate.expression.Expression osztály definiálja, hogy néhány beépített Criterion típust kapjon.
Lista macskák = sess.createCriteria(Cat.class)
.add( Expression.like("name", "Fritz%") )
.add( Expression.between("weight", minWeight, maxWeight))
.list(); Az kifejezések logikusan csoportosíthatók.
Lista macskák = sess.createCriteria(Cat.class)
.add( Expression.like("name", "Fritz%") )
.add( Expression.or( Expression.eq( "age", new Integer(0)), Expression.isNull("age"))
.list();
Lista macskák = sess.createCriteria(Cat.class)
.add( Expression.in( "name",new String[]{"Fritz","Izi","Pk"}))
.add( Expression.disjunction()
.add( Expression.isNull("kor") )
.add( Expression.eq("kor", új egész szám(0)) )
.add( Expression.eq("age", új egész szám(1)) )
.add( Expression.eq("age", új egész szám(2) )) ) ) )
.list(); Számos előre elkészített feltételtípus létezik (az Expressions alosztályai). Van egy különösen hasznos megoldás, amely lehetővé teszi, hogy közvetlenül beágyazd az SQL-t.
Lista macskák = sess.createCriteria(Cat.class)
.add( Expression.sql("lower($alias.name) mint lower(?)", "Fritz%", Hibernate.STRING))
.list(); ha {alias} helymeghatározó, akkor a lekérdezett entitás soraliájával helyettesítik. (Eredeti: A {alias} helykitöltőt a lekérdezett entitás soralias-a helyettesíti.)
3. Rendezd az eredményeket Használhatod a net.sf.hibernate.expression.Order fájlt az eredményhalmazhoz.
Lista macskák = sess.createCriteria(Cat.class)
.add( Expression.like("name", "F%")
.addOrder( Order.asc("name"))
.addOrder( Order.desc("age"))
.setMaxResults(50)
.list();
4. Assszociációk A createCriteria() segítségével az asszociációk között könnyen meghatározhatod a korlátokat a kapcsolatok közötti entitások között.
Lista macskák = sess.createCriteria(Cat.class)
.add( Expression.like("name", "F%")
.createCriteria ("kiscicák")
.add( Expression.like("name","F%")
.list();
Fontos megjegyezni, hogy a második createCriteria() egy új Criteria példányt ad vissza, amely a kittens gyűjtemény osztályának egy elemére mutat. Az alábbi alternatív formák hasznosak bizonyos helyzetekben.
Lista macskák = sess.createCriteria(Cat.class)
.createAlias("kittens", "kt")
.createAlias("mat", "mt")
.add(Expression.eqProperty("kt.name", "mt.name"))
.list();
(createAlias()) nem hoz létre új példányt a Kritériumokból. Fontos megjegyezni, hogy a Cat példány által az előző két lekérdezésben lévő kittens collection osztály nem előre szűrve van kritériumok alapján! Ha csak a kritériumoknak megfelelő kiscicákat szeretnél visszaküldeni, a returnMaps() segítségével kell használnod.
Lista macskák = sess.createCriteria(Cat.class)
.createCriteria("kittens", "kt")
.add( Expression.eq("name", "F%") )
.returnMaps()
.list();
Iterator iter = cats.iterator();
while ( iter.hasNext())
{
Map map = (Leképezés) iter.next();
Macskamacska = (Macska) map.get(Criteria.ROOT_ALIAS);
Macskacica = (Macska) map.get("kt");
}
5. Dinamikus assosiáció lekérés Az asszociációs objektumok automatikus lekérési politikáját úgy módosíthatod, ha futásidőben beállítod a FetchMode() opciót.
Lista macskák = sess.createCriteria(Cat.class)
.add( Expression.like("name", "Fritz%") )
.setFetchMode("mate", FetchMode.EAGER)
.list();
Ez a lekérdezés mind a párt, mind a kiscicákat külső csatlakozáson keresztül juttatja meg.
6. A Example queries net.sf.hibernate.expression.Example osztály szerint a megadott példányból lekérdezési feltételeket hozhatsz létre.
Macskamacska = új Macska();
cat.setSex ('F');
cat.setColor (Szín.FEKETE);
Lista eredmények = session.createCriteria(Cat.class)
.add( Example.create(cat) )
.list(); A verzió tulajdonságai, reprezentációs tulajdonságai és az asszociációk mind figyelmen kívül kerülnek. Alapértelmezés szerint a null attribútumok is kizárnak. Módosíthatod, hogyan alkalmazzák a példát. Képes vagy hogy módosítsam, hogyan alkalmazzák a példát. Példa = Example.create(cat) .excludeZeroes() //exclude nulla értékű tulajdonságok
.excludeProperty("color") //exclude a "color" nevű tulajdonságot .ignoreCase() //csinálj kihallgatásmentes string összehasonlításokat
.enableLike(); Használd like húrok összehasonlításához
Lista eredmények = session.createCriteria(Cat.class)
.add(példa)
.list(); Példákat is használhatsz a kapcsolódó objektumok kritériumainak meghatározására. Lista eredmények = session.createCriteria(Cat.class) .add(Example.create(cat))
.createCriteria("mat") .add(Example.create(cat.getMate()))) .list();
A referencia kód a következő:
|
Előző:LINQ bal, jobb és belső kapcsolatokKövetkező:A különbség a let és var definíciós változók között js-ben
|