Эта статья является зеркальной статьёй машинного перевода, пожалуйста, нажмите здесь, чтобы перейти к оригиналу.

Вид: 16672|Ответ: 0

[Источник] Подробное использование createCriteria — это запрос QBC в Hibernate

[Скопировать ссылку]
Опубликовано 09.08.2017 14:26:13 | | |

Теперь допустим, что есть класс 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();


Код отчёта следующий:






Предыдущий:LINQ — левое, правое и внутреннее соединение
Следующий:Разница между переменными определения let и var в js
Отказ:
Всё программное обеспечение, программные материалы или статьи, публикуемые Code Farmer Network, предназначены исключительно для учебных и исследовательских целей; Вышеуказанный контент не должен использоваться в коммерческих или незаконных целях, иначе пользователи несут все последствия. Информация на этом сайте взята из Интернета, и споры по авторским правам не имеют отношения к этому сайту. Вы должны полностью удалить вышеуказанный контент с компьютера в течение 24 часов после загрузки. Если вам нравится программа, пожалуйста, поддержите подлинное программное обеспечение, купите регистрацию и получите лучшие подлинные услуги. Если есть нарушение, пожалуйста, свяжитесь с нами по электронной почте.

Mail To:help@itsvse.com