|
|
Zverejnené 9. 8. 2017 14:26:13
|
|
|

Teraz povedzme, že existuje trieda Študent s atribútmi id, meno, vek Reťazec hql = "zo študenta s"; Ako kedysi, tak to robíme aj zvyčajne Query query = session.createQuery(hql); Alebo ak chcete hľadať podľa podmienok. String hql = "from Student s where s.name like 'King%'" Query query = session.createQuery(hql); Ak použijete QBC namiesto HQL, kód je nasledovný: Kritériá =session.createCriteria(Student.class); Kritérium = Expression.like("meno","kráľ%"); Nevidím to takto. Potom pridáme podmienku vyhľadávania k veku 22 rokov.
HQL: Reťazec hql = "zo študenta s, kde s.name ako 'Wang%' a s.age = 22 "; Query query = session.createQuery(hql); List list = query.list();
QBC: Kritériá =session.createCriteria(Student.class); Kritérium 1 = Expression.like("name","king%"); Kritérium2 = Expression.eq("age",newInteger(22)); criterion.add(criterion1).add(criterion2); List list = criteria.list();
Vyzerá to oveľa nemotornejšie. Ale každý, kto robil projekt, vie, že keď sa zmení obchodná logika modulu, často musí prepísať SQL, a najotravnejšie a najotravnejšie je vziať niekomu inému HQL alebo SQL. Ak použijete QBC, výrazne to zvýši čitateľnosť a udržiavateľnosť kódu. Je dôležité poznamenať, že nulová hodnota je hodnota Napríklad, keď chceme nájsť objekt Student s nulovým menom, mali by sme ho napísať takto Kritériá =session.createCriteria(Student.class); Kritérium = Expression.isNull("meno"); criterion.add(criterion).list(); a medzi tým... a čas Kritériá =session.createCriteria(Student.class); Kritérium 1 = Expression.ge("vek", nové celé číslo(20)); Dolná hranica Kritérium kritéria2 = Expression.le("vek", nové celé číslo(25)); Strop
//这里也可以把上述两个条件添加到第三个条件里 Kritérium3 =Expression.and(criterion1,criterion2); criterion.add(criterion3).list(); Ekvivalent od študentov vo veku medzi 20 a 25 rokmi Ekvivalent od študenta s, kde s.vek >= 20 a s.vek <=25
Nasleduje porovnanie bežne používaných podmienok dotazovania HQL a QBC Význam výrazu HQL QBC väčšie alebo rovné > = Expression.ge() Väčšie ako > Expression.gt() Menej alebo rovné < = Expression.le() Menej ako < Expression.lt() rovná sa = Expression.eq() nerovná sa <>alebo!= Expression.ne()
Null je null Expression.isNull() is notnull Expression.isNotNull() V rámci špecifikovaného rozsahu medzi a Expression.between() Nie v špecifikovanom rozsahu, nie medzi a Expression.not(Expression.between()) Patriaca do zbierky v Expression.in() Nie je súčasťou kolekcie notin Expression.not(Expression.in()) a expression.and() alebo Expression.or() Nie expression.not() Fuzzy dotaz ako Expression.like
1. Vytvoriť inštanciu kritérií net.sf.hibernate.Criteria Toto rozhranie predstavuje dotaz na konkrétnu triedu perzystencie. Session je továreň používaná na výrobu inštancie Criteria.
Kritériá crit = sess.createCriteria(Cat.class);
crit.setMaxResults(50);
List cats = crit.list();
2. Zúžiť rozsah množiny výsledkov Podmienka dotazu (Criterion) je inštancia rozhrania net.sf.hibernate.expression.criterion. Trieda net.sf.hibernate.expression.Expression definuje na získanie niektorých vstavaných typov kritérií.
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("name", "Fritz%") )
.add( Expression.between("weight", minWeight, maxWeight))
.list(); Výrazy možno logicky zoskupiť.
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("name", "Fritz%") )
.add( Expression.or( Expression.eq( "vek", nové celé číslo(0) ), Expression.isNull("vek")))
.list();
List cats = sess.createCriteria(Cat.class)
.add( Expression.in( "name",new String[]{"Fritz","Izi","Pk"}))
.add( Expression.disjunction()
.add( Expression.isNull("vek") )
.add( Expression.eq("vek", nové celé číslo(0) ) )
.add( Expression.eq("age", nové celé číslo(1) ) )
.add( Expression.eq("vek", nové celé číslo(2) ) ) ) ) )
.list(); Existuje veľa predpripravených typov podmienok (podtriedy výrazov). Existuje jeden obzvlášť užitočný, ktorý umožňuje priamo vložiť SQL.
List cats = sess.createCriteria(Cat.class)
.add( Expression.sql("lower($alias.name) like lower(?)", "Fritz%", Hibernate.STRING))
.list(); kde {alias} je zástupca, bude nahradený aliasom riadku dotazovanej entity. (Pôvodné: Zástupca {alias} by bol nahradený riadkovým aliasom dotazovanej entity.)
3. Zoradiť výsledky Môžete použiť net.sf.hibernate.expression.Order na zoradenie množiny výsledkov.
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("meno", "F%")
.addOrder( Order.asc("name"))
.addOrder( Order.desc("age"))
.setMaxResults(50)
.list();
4. Asociácie Môžete použiť createCriteria() medzi asociáciami na jednoduché určenie obmedzení medzi entitami s vzťahmi.
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("meno", "F%")
.createCriteria("mačiatka")
.add( Expression.like("name","F%")
.list();
Všimnite si, že druhý createCriteria() vracia novú inštanciu Criteria, ktorá odkazuje na prvok triedy zbierky kittens. Nasledujúce alternatívne formy sú užitočné v konkrétnych situáciách.
List cats = sess.createCriteria(Cat.class)
.createAlias("kittens", "kt")
.createAlias("mate", "mt")
.add(Expression.eqProperty("kt.name", "mt.name"))
.list();
(createAlias()) nevytvára novú inštanciu Kritérií. Upozorňujeme, že trieda kolekcie mačiatok, ktorú drží inštancia Cat v predchádzajúcich dvoch dotazoch, nie je predfiltrovaná podľa kritérií! Ak chcete vrátiť len mačiatka, ktoré spĺňajú kritériá, musíte použiť returnMaps().
List cats = sess.createCriteria(Cat.class)
.createCriteria("kittens", "kt")
.add( Expression.eq("meno", "F%") )
.returnMaps()
.list();
Iterator iter = cats.iterator();
while ( iter.hasNext())
{
Map map = (Map) iter.next();
Cat cat = (Cat) map.get(Criteria.ROOT_ALIAS);
Mačacie mačiatko = (Mačka) map.get("kt");
}
5. Dynamické načítavanie asociácií Môžete zmeniť automatickú politiku načítavania asociačných objektov nastavením FetchMode() počas behu.
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("name", "Fritz%") )
.setFetchMode("mate", FetchMode.EAGER)
.list();
Tento dotaz prinesie partnera aj mačiatka cez vonkajšie spojenie.
6. Podľa príkladových dotazov net.sf.hibernate.expression.example triedy môžete vytvoriť podmienky dotazu zo špecifikovanej inštancie.
Cat cat = nový Cat();
cat.setSex('F');
cat.setColor(Color.BLACK);
List results = session.createCriteria(Cat.class)
.add( Example.create(cat) )
.list(); Vlastnosti verzií, vlastnosti reprezentácie a asociácie sú všetky ignorované. Predvolene sú vylúčené aj nulové atribúty. Môžete upraviť, ako sa príklad aplikuje. Môžeš na úpravu spôsobu použitia príkladu. Príklad = Example.create(cat) .excludeZeroes() //exclude vlastnosti s nulovou hodnotou
.excludeProperty("color") //exclude vlastnosť s názvom "color" .ignoreCase() //vykonávajte porovnania reťazcov bez ohľadu na prípady
.enableLike(); Použitie like na porovnanie reťazcov
List results = session.createCriteria(Cat.class)
.add(example)
.list(); Môžete dokonca použiť príklady na stanovenie kritérií pre súvisiace objekty. List results = session.createCriteria(Cat.class) .add(Example.create(cat) )
.createCriteria("mate") .add(Example.create(cat.getMate())) .list();
Referenčný kód je nasledovný:
|
Predchádzajúci:LINQ ľavé, pravé a vnútorné spojeniaBudúci:Rozdiel medzi definačnými premennými nech a var v js
|