|
|
Zveřejněno 09.08.2017 14:26:13
|
|
|

Teď si představme, že existuje třída Student s atributy ID, Jméno, Věk Řetězec hql = "od studenta s"; Jak jsme to dělali dřív, tak to děláme i obvykle Query query = session.createQuery(hql); Nebo pokud chcete hledat podle podmínek. String hql = "od Student s kde s.name jako 'King%'" Query query = session.createQuery(hql); Pokud použijete QBC místo HQL, pak je kód následující: Kritéria =session.createCriteria(Student.class); Kritérium = Expression.like("jméno","král%"); Nedokážu to takhle vidět. Pak přidáme podmínku vyhledávání k věku 22 let.
HQL: Řetězec hql = "ze studenta s kde s.name jako 'Wang%' a s.age = 22 "; Query query = session.createQuery(hql); List list = query.list();
QBC: Kritéria =session.createCriteria(Student.class); Kritérium1 = Expression.like("name","king%"); Kritérium2 = Expression.eq("věk",newInteger(22)); criteria.add(criterion1).add(criterion2); List list = criteria.list();
Vypadá to mnohem těžkopádněji. Ale každý, kdo dělal projekt, ví, že když se změní obchodní logika modulu, často musí přepsat SQL, a nejvíc otravné a otravné je vzít něčí jinou HQL nebo SQL. Pokud používáte QBC, výrazně to zvyšuje čitelnost a udržovatelnost kódu. Je důležité poznamenat, že nulová hodnota je hodnota Například když chceme najít objekt Student s nulovým jménem, měli bychom ho napsat takto Kritéria =session.createCriteria(Student.class); Kritérium = Expression.isNull("název"); criteria.add(criterion).list(); a používání mezi... a čas Kritéria =session.createCriteria(Student.class); Kritérium 1 = Expression.ge("věk", nové celé číslo(20)); Dolní limit Kritérium2 = Expression.le("věk",nové celé číslo(25)); Strop
//这里也可以把上述两个条件添加到第三个条件里 Kritérium3 =Expression.and(criterion1,criterion2); criteria.add(criterion3).list(); Ekvivalent od studentů ve věku mezi 20 a 25 lety Ekvivalent od studenta s, kde s.věk >= 20 a s.věk <=25
Následuje srovnání běžně používaných podmínek dotazu HQL a QBC Význam výrazu HQL QBC větší nebo rovno > = Expression.ge() Větší než > Expression.gt() Méně nebo rovno < = Expression.le() Méně než < Expression.lt() rovná se = Expression.eq() nerovná se <>nebo!= Expression.ne()
Null je null Expression.isNull() is notnull Expression.isNotNull() V rámci stanoveného rozsahu mezia Expression.between() Není v určeném rozsahu, není mezi a Expression.not(Expression.between()) Patřící ke sbírce v Expression.in() Není součástí kolekce notin Expression.not(Expression.in()) a expression.and() nebo Expression.or() Not Expression.not() Fuzzy dotaz jako Expression.like
1. Vytvořte instanci kritérií net.sf.hibernate.Criteria Toto rozhraní představuje dotaz na konkrétní třídu perspektivnosti. Session je továrna používaná k výrobě instance Criteria.
Kritéria krit = sess.createCriteria(Cat.class);
crit.setMaxResults(50);
List cats = crit.list();
2. Zúžit rozsah výsledné množiny Dotazovací podmínka (Criterion) je instance rozhraní net.sf.hibernate.expression.Criterion. Třída net.sf.hibernate.expression.Expression definuje tak, aby získala některé vestavěné typy kritérií.
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("name", "Fritz%") )
.add( Expression.between("weight", minWeight, maxWeight))
.list(); Výrazy lze logicky seskupit.
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("name", "Fritz%") )
.add( Expression.or( Expression.eq( "věk", nové celé číslo(0) ), Expression.isNull("věk")))
.list();
List cats = sess.createCriteria(Cat.class)
.add( Expression.in( "name",new String[]{"Fritz","Izi","Pk"}))
.add( Expression.disjunction()
.add( Expression.isNull("věk") )
.add( Expression.eq("age", nové celé číslo(0) ) )
.add( Expression.eq("age", nové celé číslo(1) ) )
.add( Expression.eq("věk", nové celé číslo(2) ) ) ) )
.list(); Existuje mnoho předpřipravených typů podmínek (podtříd Expressions). Existuje jeden obzvlášť užitečný systém, který umožňuje přímo vložit SQL.
List cats = sess.createCriteria(Cat.class)
.add( Expression.sql("lower($alias.name) like lower(?)", "Fritz%", Hibernate.STRING))
.list(); kde {alias} je zástupný symbol, bude nahrazen aliasem řádku dotazované entity. (Originál: Zástupce {alias} bude nahrazen aliasem řádku dotazované entity.)
3. Seřadit výsledky Můžete použít net.sf.hibernate.expression.Order k seřazení množiny výsledků.
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("name", "F%")
.addOrder( Order.asc("name"))
.addOrder( Order.desc("age"))
.setMaxResults(50)
.list();
4. Asociace Můžete použít createCriteria() mezi asociacemi k snadnému určení omezení mezi entitami s relacemi.
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("name", "F%")
.createCriteria("koťata")
.add( Expression.like("name","F%")
.list();
Všimněte si, že druhý createCriteria() vrací novou instanci Criteria, která ukazuje na prvek třídy kolekce kittens. Následující alternativní formy jsou užitečné v konkrétních situacích.
List cats = sess.createCriteria(Cat.class)
.createAlias("koťata", "kt")
.createAlias("mate", "mt")
.add(Expression.eqProperty("kt.name", "mt.name"))
.list();
(createAlias()) nevytváří novou instanci Kritérií. Všimněte si, že třída kočiat držená instancí Cat v předchozích dvou dotazech není předfiltrována podle kritérií! Pokud chcete vracet pouze koťata, která splňují kritéria, musíte použít returnMaps().
List cats = sess.createCriteria(Cat.class)
.createCriteria("kittens", "kt")
.add( Expression.eq("name", "F%") )
.returnMaps()
.list();
Iterator iter = cats.iterator();
while ( iter.hasNext())
{
Map map = (Map) iter.next();
Cat cat = (Cat) map.get(Criteria.ROOT_ALIAS);
Kočičí kotě = (Kočka) map.get("kt");
}
5. Dynamické načítání asociace Můžete změnit automatickou politiku načítání asociačních objektů nastavením FetchMode() za běhu.
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("name", "Fritz%") )
.setFetchMode("mate", FetchMode.EAGER)
.list();
Tento dotaz přivede partnera i koťata přes vnější spojení.
6. Podle příkladových dotazů net.sf.hibernate.expression.example třídy můžete vytvářet podmínky dotazu z dané instance.
Kočka kočka = nová Kočka();
cat.setSex ('F');
cat.setColor(Color.BLACK);
Seznam výsledků = session.createCriteria(Cat.class)
.add( Example.create(cat) )
.list(); Vlastnosti verzí, vlastnosti reprezentace a asociace jsou všechny ignorovány. Výchozím nastavením jsou také nulové atributy vyloučeny. Můžete upravit, jak je příklad aplikován. Můžeš aby se upravilo, jak je příklad aplikován. Příklad = Example.create(cat) .excludeZeroes() //exclude vlastnosti s nulovou hodnotou
.excludeProperty("color") //exclude vlastnost nazvanou "color" .ignoreCase() //provádějte porovnání řetězců bez rozlišování případů
.enableLike(); Použití like pro porovnání řetězců
Seznam výsledků = session.createCriteria(Cat.class)
.add(example)
.list(); Můžete dokonce použít příklady k nastavení kritérií pro přidružené objekty. List results = session.createCriteria(Cat.class) .add(Example.create(cat) )
.createCriteria("mate") .add(Example.create(cat.getMate())) .list();
Referenční kód je následující:
|
Předchozí:LINQ levé, pravé a vnitřní spojeníDalší:Rozdíl mezi definujícími proměnnými nech a var v js
|