Теперь допустим, что есть класс Student с атрибутами id, name, age Строка 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() is 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);
Список кошек = 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("age")))
.list();
List cats = sess.createCriteria(Cat.class)
.add( Expression.in( "name",new String[]{"Fritz","Izi","Pk"}))
.add( Expression.disjunction()
.add( Expression.isNull("возраст") )
.add( Expression.eq("age", новое целое число(0)) )
.add( Expression.eq("возраст", новое целое число(1)) )
.add( Expression.eq("age", новое целое число(2)) ) ) )
.list(); Существует много готовых типов условий (подклассов выражений). Есть особенно полезный вариант, который позволяет встраивать SQL напрямую.
List cats = sess.createCriteria(Cat.class)
.add( Expression.sql("lower($alias.name) like lower(?)", "Fritz%", Hibernate.STRING))
.list(); где {alias} является заполнителем, он будет заменён строковым псевдонимом запрошенной сущности. (Оригинал: замена {alias} должна быть заменена на псевдоним строки запрашиваемой сущности.)
3. Сортировать результаты Вы можете использовать net.sf.hibernate.expression.Order для сортировки набора результатов.
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("имя", "F%")
.addOrder( Order.asc("name"))
.addOrder( Order.desc("age"))
.setMaxРезультаты(50)
.list();
4. Ассоциации Вы можете использовать createCriteria() между ассоциациями, чтобы легко задавать ограничения между сущностями с отношениями.
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("имя", "F%")
.createCriteria("котята")
.add( Expression.like("name","F%")
.list();
Обратите внимание, что второй createCriteria() возвращает новый экземпляр Criteria, указывающий на элемент класса коллекции котят. Следующие альтернативные формы полезны в конкретных ситуациях.
List cats = sess.createCriteria(Cat.class)
.createAlias("котята", "kt")
.createAlias ("mate", "mt")
.add(Expression.eqProperty("kt.name", "mt.name"))
.list();
(createAlias()) не создаёт новый экземпляр Критериев. Обратите внимание, что класс коллекции котят, который хранит экземпляр Cat в предыдущих двух запросах, не предварительно отфильтрован по критериям! Если вы хотите вернуть только тех котят, которые соответствуют критериям, используйте returnMaps().
List cats = 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() во время выполнения.
List cats = 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") //exclude the property named "color" .ignoreCase() //perform сравнения строк без регистра
.enableLike(); Используйте LIKE для сравнения строк
Список результатов = session.createCriteria(Cat.class)
.add (пример)
.list(); Вы даже можете использовать примеры для установления критериев связанных объектов. Результаты списка = session.createCriteria(Cat.class) .add(Example.create(cat) )
.createCriteria("mate") .add(Example.create(cat.getMate())) .list();
Код отчёта следующий:
|