|
|
Geplaatst op 09-08-2017 14:26:13
|
|
|

Stel nu dat er een Student-klasse is met id-, naam- en leeftijdsattributen String hql = "van Student s"; Zoals we vroeger deden, doen we dat meestal Query query = session.createQuery(hql); Of als je wilt zoeken volgens de voorwaarden. String hql = "van Student s waar s.name zoals 'King%'" Query query = session.createQuery(hql); Als je QBC gebruikt in plaats van HQL, dan is de code: Criteria criteria =session.createCriteria(Student.class); Criteriumcriterium = Uitdrukking.like("naam","koning%"); Ik kan het niet zo zien. Vervolgens voegen we de zoekvoorwaarde toe aan de leeftijd van 22.
HQL: String hql = "van Student s waarbij s.name zoals 'Wang%' en s.age= 22 "; Query query = session.createQuery(hql); List list = query.list();
QBC: Criteria criteria =session.createCriteria(Student.class); Criteriumcriterium1 = Uitdrukking.like("naam","koning%"); Criteriumcriterium2 = Expression.eq("age",newInteger(22)); criteria.add(criterium1).add(criterium2); Lijstlijst = criteria.list();
Het ziet er veel omslachtiger uit. Maar iedereen die een project heeft gedaan, weet dat wanneer de bedrijfslogica van een module verandert, het vaak SQL moet herschrijven, en het meest irritante en irritante is het nemen van iemand anders' HQL of SQL. Als je QBC gebruikt, verhoogt dat de leesbaarheid en onderhoudbaarheid van de code aanzienlijk. Het is belangrijk op te merken dat de nulwaarde de waarde is Als we bijvoorbeeld een Student-object met een nullnaam willen vinden, moeten we het zo schrijven Criteria criteria =session.createCriteria(Student.class); Criteriumcriterium = Expression.isNull("name"); criteria.add(criterion).list(); en gebruiken tussen... en tijd Criteria criteria =session.createCriteria(Student.class); Criteriumcriterium1 = Expression.ge("leeftijd", nieuw geheel getal(20)); Ondergrens Criteriumcriterium2 = Uitdrukking.le("leeftijd",nieuw geheel getal(25)); Plafond
//这里也可以把上述两个条件添加到第三个条件里 Criteriumcriterium3 =Expressie.en(criterium1,criterium2); criteria.add(criterion3).list(); Gelijk aan studenten met een leeftijd tussen 20 en 25 Equivalent aan van Student s waarbij s.age >= 20 en s.age <=25
Hieronder volgt een vergelijking van de veelgebruikte queryvoorwaarden van HQL en QBC Expressie die HQL QBC betekent groter dan of gelijk aan > = Expression.ge() Groter dan > Expression.gt() Minder dan of gelijk aan < = Expression.le() Minder dan < Expression.lt() gelijk = Expression.eq() is niet gelijk aan <>of!= Expression.ne()
Null is null Expression.isNull() is notnull Expression.isNotNull() Binnen het opgegeven bereik tussenen en Expression.between() Niet in het opgegeven bereik niet tussenen en Expression.not(Expression.between()) Behorend tot een collectie in Expression.in() Niet onderdeel van een collectie notin Expression.not(Expression.in()) en expressie.en() of Expression.or() Not Expression.not() Fuzzy query zoals Expression.like
1. Maak een Criteria-instantie net.sf.hibernate.Criteria Deze interface vertegenwoordigt een query voor een specifieke persistentieklasse. Session is de fabriek die wordt gebruikt om de Criteria-instantie te produceren.
Criteria crit = sess.createCriteria(Cat.class);
crit.setMaxResults(50);
List cats = crit.list();
2. Verklein de reikwijdte van de resultaatset Een queryvoorwaarde (Criterion) is een instantie van de net.sf.hibernate.expression.Criterion-interface. De klasse net.sf.hibernate.expression.Expression definieert om enkele ingebouwde Criterion-types te verkrijgen.
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("name", "Fritz%") )
.add( Expression.between("weight", minWeight, maxWeight))
.list(); Uitdrukkingen kunnen logisch worden gegroepeerd.
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("name", "Fritz%") )
.add( Expression.or( Expression.eq( "age", nieuwe Integer(0) ), Expression.isNull("age")))
.list();
List cats = sess.createCriteria(Cat.class)
.add( Expression.in( "name",new String[]{"Fritz","Izi","Pk"}))
.add( Expression.disjunctioun()
.add( Expression.isNull("age") )
.add( Expression.eq("age", nieuwe Integer(0) ) )
.add( Expression.eq("age", nieuw Integer(1) ) )
.add( Expression.eq ("age", nieuw Integer(2) ) ) ) )
.list(); Er zijn veel vooraf gemaakte conditietypen (subklassen van expressies). Er is een bijzonder nuttige waarmee je SQL direct kunt inbedden.
List cats = sess.createCriteria(Cat.class)
.add( Expression.sql("lower($alias.name) like lower(?)", "Fritz%", Hibernate.STRING))
.list(); waarbij {alias} een tijdelijke vervanger is, wordt deze vervangen door de regelalias van de geraadpleegde entiteit. (Origineel: De {alias}-plaatshouder moet worden vervangen door de rijalias van de geraadpleegde entiteit.)
3. Sorteer de resultaten Je kunt net.sf.hibernate.expression.Order gebruiken om de resultaatset te sorteren.
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("name", "F%")
.addOrder( Order.asc("naam"))
.addOrder( Order.desc("age"))
.setMaxResults(50)
.list();
4. Associaties Je kunt createCriteria() tussen associaties gebruiken om eenvoudig beperkingen te specificeren tussen entiteiten met relaties.
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("name", "F%")
.createCriteria("kittens")
.add( Expression.like("name","F%")
.list();
Let op dat de tweede createCriteria() een nieuwe instantie van Criteria teruggeeft, die verwijst naar een element van de kittens collection-klasse. De volgende alternatieve vormen zijn nuttig in specifieke situaties.
List cats = sess.createCriteria(Cat.class)
.createAlias("kittens", "kt")
.createAlias("mate", "mt")
.add(Expression.eqProperty("kt.name", "mt.name"))
.list();
(createAlias()) maakt geen nieuwe instantie van de Criteria aan. Let op: de kittens-verzamelklasse die door de Cat-instantie in de vorige twee zoekopdrachten wordt gehouden, is niet vooraf gefilterd door criteria! Als je alleen kittens wilt terugbrengen die aan de criteria voldoen, moet je returnMaps() gebruiken.
List cats = sess.createCriteria(Cat.class)
.createCriteria("kittens", "kt")
.add( Expression.eq("name", "F%") )
.returnMaps()
.list();
Iterator iter = cats.iterator();
terwijl (iter.hasNext())
{
Map map = (Map) iter.next();
Kat kat = (Kat) map.get(Criteria.ROOT_ALIAS);
Kat kitten = (Kat) map.get("kt");
}
5. Dynamische associatie-ophaling Je kunt het automatische ophaalbeleid van associatieobjecten wijzigen door FetchMode() tijdens runtime in te stellen.
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("name", "Fritz%") )
.setFetchMode("mate", FetchMode.EAGER)
.list();
Deze vraag zal zowel partner als kittens via outer join krijgen.
6. Volgens de Voorbeeldqueries net.sf.hibernate.expression.Example-klasse kun je queryvoorwaarden creëren vanuit de gespecificeerde instantie.
Kat kat = nieuwe Kat();
kat.setSex('F');
cat.setColor(Color.ZWART);
Lijstresultaten = session.createCriteria(Cat.class)
.add( Example.create(cat) )
.list(); Versie-eigenschappen, representatie-eigenschappen en associaties worden allemaal genegeerd. Standaard worden null-attributen ook uitgesloten. Je kunt aanpassen hoe het voorbeeld wordt toegepast. U kunt om aan te passen hoe het voorbeeld wordt toegepast. Voorbeeldvoorbeeld = Example.create(cat) .excludeZeroes() //exclude nulwaardige eigenschappen
.excludeProperty("color") //sluit de eigenschap genaamd "color" uit .ignoreCase() //voer hoofdval-ongevoelige stringvergelijkingen uit
.enableLike(); Gebruik Like voor stringvergelijkingen
Lijstresultaten = session.createCriteria(Cat.class)
.add(voorbeeld)
.list(); Je kunt zelfs voorbeelden gebruiken om criteria vast te stellen voor bijbehorende objecten. Lijstresultaten = session.createCriteria(Cat.class) .add(Example.create(cat) )
.createCriteria("mate"), .add(Example.create(cat.getMate())) .list();
De referentiecode is als volgt:
|
Vorig:LINQ links, rechts en binnenverbindingenVolgend:Het verschil tussen let en var-definitievariabelen in js
|