Тепер припустимо, що є клас Student з атрибутами id, імені, віку Рядок hql = «від Студента s»; Як раніше, так і робимо Query query = session.createQuery(hql); Або якщо ви хочете шукати відповідно до умов. String hql = "з Student s, де s.name як 'King%'" Query query = session.createQuery(hql); Якщо ви використовуєте QBC замість HQL, тоді код виглядає: Criteria criteria =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: Criteria criteria =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 з нульовим ім'ям, слід записувати його так Criteria criteria =session.createCriteria(Student.class); Критерій критерію = Expression.isNull("ім'я"); criteria.add(criterion).list(); і використання між... і час Criteria criteria =session.createCriteria(Student.class); Критерій критерію1 = Expression.ge("вік"), нове ціле число(20)); Нижня межа критерій критерію2 = Expression.le("вік",нове ціле число(25)); Стеля
//这里也可以把上述两个条件添加到第三个条件里 критерій критерію3 =Expression.and(criterion1,criterion2); 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() equals = 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.Criteria Цей інтерфейс представляє запит до певного класу збереження. 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.
Список котів = sess.createCriteria(Cat.class)
.add( Expression.like("ім'я", "Fritz%") )
.add( Expression.between("weight", minWeight, maxWeight))
.list(); Вирази можна логічно групувати.
Список котів = sess.createCriteria(Cat.class)
.add( Expression.like("ім'я", "Fritz%") )
.add( Expression.or( Expression.eq( "вік", нове ціле число(0)), Expression.isNull("age")))
.list();
Список котів = sess.createCriteria(Cat.class)
.add( Expression.in( "name",new String[]{"Fritz","Izi","Pk"}))
.add( Вираз.диз'юнкція()
.add( Expression.isNull("вік") )
.add( Expression.eq("age", нове ціле число(0)) )
.add( Expression.eq("вік", нове ціле число(1)) )
.add( Expression.eq("вік", нове ціле число(2) ) ) )
.list(); Існує багато готових типів умов (підкласів виразів). Є особливо корисний варіант, який дозволяє вбудовувати SQL напряму.
Список котів = sess.createCriteria(Cat.class)
.add( Expression.sql("lower($alias.name), як lower(?)", "Fritz%", Hibernate.STRING))
.list(); де {alias} є тимчасовим варіантом, його замінить лінійний псевдонім запитуваної сутності. (Оригінал: заповнювач {alias} буде замінений на рядковий псевдонім запитуваної сутності.)
3. Сортувати результати Ви можете використати net.sf.hibernate.expression.Order для сортування набору результатів.
Список котів = sess.createCriteria(Cat.class)
.add( Expression.like("ім'я", "F%")
.addOrder( Order.asc("name"))
.addOrder( Order.desc("age"))
.setMaxРезультати(50)
.list();
4. Асоціації Ви можете використовувати createCriteria() між асоціаціями, щоб легко визначати обмеження між сутностями зі зв'язками.
Список котів = sess.createCriteria(Cat.class)
.add( Expression.like("ім'я", "F%")
.createCriteria("кошенята")
.add( Expression.like("name","F%")
.list();
Зверніть увагу, що другий createCriteria() повертає новий екземпляр Criteria, який вказує на елемент класу kittens collection. Наступні альтернативні форми корисні в конкретних ситуаціях.
Список котів = sess.createCriteria(Cat.class)
.createAlias("кошенята", "kt")
.createAlias ("mate", "mt")
.add(Expression.eqProperty("kt.name", "mt.name"))
.list();
(createAlias()) не створює новий екземпляр Критеріїв. Зверніть увагу, що клас колекції кошенят, який зберігає екземпляр Cat у попередніх двох запитах, не попередньо відфільтрований за критеріями! Якщо ви хочете повертати лише кошенят, які відповідають критеріям, потрібно використовувати returnMaps().
Список котів = sess.createCriteria(Cat.class)
.createCriteria("кошенята", "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() під час виконання.
Список котів = sess.createCriteria(Cat.class)
.add( Expression.like("ім'я", "Fritz%") )
.setFetchMode("mate", FetchMode.EAGER)
.list();
Цей запит отримає і партнера, і кошенят через зовнішнє з'єднання.
6. Відповідно до Example queries net.sf.hibernate.expression.Example класу, ви можете створювати умови запиту з заданого екземпляра.
Кіт = новий кіт();
cat.setSex('F');
cat.setColor(Color.BLACK);
Список результатів = session.createCriteria(Cat.class)
.add( Example.create(cat) )
.list(); Властивості версій, властивості представлення та асоціації ігноруються. За замовчуванням нульові атрибути також виключаються. Ви можете налаштувати, як застосовується приклад. Ти можеш щоб коригувати спосіб застосування прикладу. Приклад прикладу = Example.create(cat) .excludeZeroes() //виключити нульові властивості
.excludeProperty("color") //виключити властивість під назвою "color" .ignoreCase() //perform порівняння рядків, незалежних від регістру
.enableLike(); Використовуйте LIKE для порівняння рядків
Список результатів = session.createCriteria(Cat.class)
.add(приклад)
.list(); Ви навіть можете використовувати приклади для встановлення критеріїв для пов'язаних об'єктів. List results = session.createCriteria(Cat.class) .add(Example.create(cat) )
.createCriteria("mate") .add(Example.create(cat.getMate())) .list();
Референтний код виглядає так:
|