Tento článek je zrcadlovým článkem o strojovém překladu, klikněte zde pro přechod na původní článek.

Pohled: 16672|Odpověď: 0

[Zdroj] Podrobné využití createCriteria je QBC dotaz v Hibernate

[Kopírovat odkaz]
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
Zřeknutí se:
Veškerý software, programovací materiály nebo články publikované organizací Code Farmer Network slouží pouze k učení a výzkumu; Výše uvedený obsah nesmí být používán pro komerční ani nelegální účely, jinak nesou všechny důsledky uživatelé. Informace na tomto webu pocházejí z internetu a spory o autorská práva s tímto webem nesouvisí. Musíte výše uvedený obsah ze svého počítače zcela smazat do 24 hodin od stažení. Pokud se vám program líbí, podporujte prosím originální software, kupte si registraci a získejte lepší skutečné služby. Pokud dojde k jakémukoli porušení, kontaktujte nás prosím e-mailem.

Mail To:help@itsvse.com