Сега да кажем, че има клас Student с атрибути id, име, възраст String hql = "от ученик s"; Както правехме преди, обикновено правим Query query = session.createQuery(hql); Или ако искате да търсите според условията. String hql = "от Student s, където s.name като 'King%'" Query query = session.createQuery(hql); Ако използвате QBC вместо HQL, тогава кодът е: Критерии =session.createCriteria(Student.class); критерий на критерий = Expression.like("име", "крал%"); Не мога да го видя така. След това добавяме условието за търсене към възрастта 22.
HQL: String hql = "от Student s, където s.name като 'Wang%' и s.age= 22"; Query query = session.createQuery(hql); List list = query.list();
QBC: Критерии =session.createCriteria(Student.class); критерий на критерия1 = Expression.like("име", "крал%"); критерий на критерий2 = Expression.eq("възраст", newInteger(22)); criteria.add(критерий1).add(критерий2); List list = criteria.list();
Изглежда много по-тромаво. Но всеки, който е правил проект, знае, че когато бизнес логиката на модула се промени, често трябва да се пренапише SQL, а най-досадното и досадно е да вземеш чужда HQL или SQL. Ако използвате QBC, това значително увеличава четимостта и поддържаемостта на кода. Важно е да се отбележи, че нулевата стойност е стойността Например, когато искаме да намерим обект Student с null име, трябва да го напишем така Критерии =session.createCriteria(Student.class); Критерий = Expression.isNull("име"); criteria.add(criterion).list(); и използване между... и време Критерии =session.createCriteria(Student.class); критерий на критерия1 = Expression.ge("възраст"), ново цяло число(20)); Долна граница Criterion criterion2 = Expression.le("възраст",ново цяло число(25)); Таван
//这里也可以把上述两个条件添加到第三个条件里 критерий на критерий 3 =Expression.and(критерий 1,критерий 2); criteria.add(criterion3).list(); Еквивалент на Student S, където възрастта е между 20 и 25 години Еквивалентно на от Student s, където s.възраст >= 20, а s.възраст <=25
Следва сравнение на често използваните условия за заявки HQL и QBC Израз, означаващ HQL QBC по-голямо или равно на > = Expression.ge() По-голямо от > Expression.gt() По-малко или равно на < = Expression.le() По-малко от < Expression.lt() равно = Expression.eq() не е равно на <>или!= Expression.ne()
Null е null Expression.isNull() е notnull Expression.isNotNull() В рамките на зададения диапазон между и Expression.between() Не е в посочения диапазон не е между и Expression.not(Expression.between()) Принадлежаща към колекция в Expression.in() Не е част от колекция notin Expression.not(Expression.in()) и изразяване.and() или Expression.or() Не Expression.not() Неясна заявка като Expression.like
1. Създайте инстанция на Criteria net.sf.hibernate. Критерии Този интерфейс представлява заявка за конкретен клас на персистентност. Session е фабриката, използвана за производство на инстанцията Criteria.
Критерий crit = sess.createCriteria(Cat.class);
crit.setMaxResults(50);
List cats = crit.list();
2. Стесняване на обхвата на набора от резултати Условие за заявка (Criterion) е инстанция на интерфейса net.sf.hibernate.expression.Criterion. Класът net.sf.hibernate.expression.expression.Expression дефинира, за да получи някои вградени типове Criterion.
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("име", "Fritz%") )
.add( Expression.between("weight", minWeight, maxWeight))
.list(); Изразите могат логично да бъдат групирани.
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("име", "Fritz%") )
.add( Expression.or( Expression.eq( "възраст", ново цяло число(0)), Expression.isNull("възраст")))
.list();
List cats = sess.createCriteria(Cat.class)
.add( Expression.in( "име",нова струна[]{"Fritz","Izi","Pk"}))
.add( Expression.disjunction()
.add( Expression.isNull("възраст") )
.add( Expression.eq("възраст", ново цяло число(0)) )
.add( Expression.eq("възраст", ново цяло число(1)) )
.add( Expression.eq("възраст", ново цяло число(2) ) ) ) )
.list(); Има много предварително създадени типове условия (подкласове на изрази). Има особено полезен, който позволява директно да вградите SQL.
List cats = sess.createCriteria(Cat.class)
.add( Expression.sql("по-ниско($alias.име) като по-ниско(?)", "Fritz%", Хибернация.STRING))
.list(); където {alias} е заместител, той ще бъде заменен с линейния алиас на заявкания обект. (Оригинал: Заместителят {alias} да бъде заменен с псевдоним на реда на запитваната единица.)
3. Сортирайте резултатите. Можете да използвате net.sf.hibernate.expression.Order, за да сортирате набора от резултати.
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("име", "F%")
.addOrder( Order.asc("име"))
.addOrder( Order.desc("възраст"))
.setMaxResults(50)
.list();
4. Асоциации Можете да използвате createCriteria() между асоциации, за да зададете лесно ограничения между обекти с връзки.
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("име", "F%")
.createCriteria("котенца")
.add( Expression.like("име","F%")
.list();
Обърнете внимание, че вторият createCriteria() връща нова инстанция на Criteria, сочеща към елемент от класа kittens collection. Следните алтернативни форми са полезни в конкретни ситуации.
List cats = sess.createCriteria(Cat.class)
.createAlias ("котенца", "kt")
.createAlias ("mate", "mt")
.add(Expression.eqProperty("kt.name", "mt.name"))
.list();
(createAlias()) не създава нов инстанция на Критериите. Имайте предвид, че класът за котенца, държан от котешката инстанция в предишните две заявки, не е предварително филтриран по критерии! Ако искате да върнете само котенца, които отговарят на критериите, трябва да използвате returnMaps().
List cats = sess.createCriteria(Cat.class)
.createCriteria("kittens", "kt")
.add( Expression.eq("име", "F%") )
.returnMaps()
.list();
Итератор iter = cats.iterator();
докато ( iter.hasNext())
{
Map map = (Map) iter.next();
Котешка котка = (Котка) map.get(Criteria.ROOT_ALIAS);
Котешко котенце = (Котка) map.get("kt");
}
5. Динамично извличане на асоциации Можете да промените политиката за автоматично извличане на асоциационни обекти, като зададете FetchMode() по време на изпълнение.
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("име", "Fritz%") )
.setFetchMode("mate", FetchMode.EAGER)
.list();
Тази заявка ще получи както партньор, така и котенца чрез външно съединяване.
6. Според примерните заявки net.sf.hibernate.expression.Example клас, можете да създадете условия за заявка от зададения инстанс.
Котешка котка = нова котка();
cat.setSex('F');
cat.setColor(Color.BLACK);
Резултати от списъка = session.createCriteria(Cat.class)
.add( Example.create(cat) )
.list(); Свойствата на версиите, свойствата на представянето и асоциациите се игнорират. По подразбиране null атрибутите също са изключени. Можете да коригирате начина, по който се прилага примерът. Можеш за да коригира начина, по който се прилага примерът. Пример = Example.create(cat) .excludeZeroes() //exclude свойства с нулева стойност
.excludeProperty("color") //exclude свойството с име "color" .ignoreCase() //perform сравнения на низове без значение на регистр
.enableLike(); Използвайте подобни за сравнение на низове
Резултати от списъка = session.createCriteria(Cat.class)
.add(пример)
.list(); Можете дори да използвате примери, за да установите критерии за свързаните обекти. Резултати от списъка = session.createCriteria(Cat.class) .add(Example.create(cat) )
.createCriteria("mate") .add(Example.create(cat.getMate())) .list();
Референтният код е следният:
|