Ця стаття є дзеркальною статтею машинного перекладу, будь ласка, натисніть тут, щоб перейти до оригінальної статті.

Вид: 16672|Відповідь: 0

[Джерело] Детальне використання createCriteria — це QBC-запит у Hibernate

[Копіювати посилання]
Опубліковано 09.08.2017 14:26:13 | | |

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


Референтний код виглядає так:






Попередній:LINQ — ліві, праві та внутрішні з'єднання
Наступний:Різниця між змінними визначення let і var у js
Застереження:
Усе програмне забезпечення, програмні матеріали або статті, опубліковані Code Farmer Network, призначені лише для навчання та досліджень; Вищезазначений контент не повинен використовуватися в комерційних чи незаконних цілях, інакше користувачі несуть усі наслідки. Інформація на цьому сайті надходить з Інтернету, і спори щодо авторських прав не мають до цього сайту. Ви повинні повністю видалити вищезазначений контент зі свого комп'ютера протягом 24 годин після завантаження. Якщо вам подобається програма, будь ласка, підтримуйте справжнє програмне забезпечення, купуйте реєстрацію та отримайте кращі справжні послуги. Якщо є будь-яке порушення, будь ласка, зв'яжіться з нами електронною поштою.

Mail To:help@itsvse.com