2.1 Query sinflari bilan tanishish
Aytgancha, yana bir muhim jihat – bu yordamchi klass Query. Uni bu misolda ko'rgan bo'lishing mumkin:
public List<Employee> getAllEmployes() {
try (Session session = sessionFactory.openSession()) {
Query<Employee> query = session.createQuery("from Employee", Employee.class);
return query.list();
}
}
Aslida, Query – bu interfeys va uning bir nechta turli maqsadlar uchun amalga oshirilishi mavjud. Ammo oddiylik uchun men uni sinf deb atayveraman. Bu, aytaylik, keng ma'noda sinf – OOP terminlarida.
Izoh. Oldin ikkita sinf mavjud edi:
- Query so'rovni tavsiflash uchun.
- TypedQuery oldindan ma'lum bo'lgan turdagi so'rovni tavsiflash uchun.
Birinchisi Hibernate allaqachon mavjud bo'lgan va generiklar hali mavjud bo'lmagan vaqtda paydo bo'lgan. Keyinchalik, JDK 5 chiqarilgandan so'ng, Hibernate'ga TypedQuery degan yana bir sinf qo'shildi, bu so'rov natijasining turini qo'llab-quvvatlardi.
Lekin, mening eslashimcha, 5-versiya bilan boshlanganda Hibernate faqat bitta tiplangan sinfni qoldirdi va u endi Query deb nomlandi.
Query yaratishning standart usuli:
Query<Employee> query = session.createQuery("from Employee", Employee.class);
Query ob'ektlarini yaratishni o'rgandingiz, lekin bu so'rovlarni qanday bajarish kerak?
Bu yerda hamma narsa yanada oson – biz Query ob'ektida list() metodini chaqiramiz:
Query<Employee> query = session.createQuery("from Employee", Employee.class);
List<Employee> resultLіst = query.list();
list() metodining JPA-sinonimi mavjud, u xuddi shu narsani qiladi, lekin getResultList() deb nomlanadi. Boshqa dasturchilarning yozgan kodida uni ba'zida uchratishingiz mumkin.
Aytgancha, agar so'rov natijasi bitta natija bo'lishi kerak deb faraz qilinsa, so'rovni chaqirish uchun uniqueResult() metodini ishlatish oson.
Query<Employee> query = session.createQuery("from Employee where id = 1", Employee.class);
Employee result = query.uniqueResult();
uniqueResult() metodining JPA-sinonimi – singleResult() metodi mavjud. U Hibernate'ning JPA standarti bilan moslashuvchanligi uchun paydo bo'lgan. U mutlaqo bir xil ishni bajaradi.
2.2 Query klassi metodlari
Aslida, Query sinfida juda ko'p turli xil metodlar mavjud. Quyida men yana uchta haqida gapirib beraman.
Birinchidan, bu stream() metodi. Va uning JPA-sinonimi getResultStream().
Bu ikki metod ro'yxat o'rniga ma'lumotlar oqimni qaytaradi. Agar sizga so'rov natijasida olingan barcha ob'ektlar kerak bo'lmasa yoki ularning faqat birinchilari ishlatilishi mumkin bo'lsa, bunday yondashuv juda samarali bo'lishi mumkin.
Misol:
Query<Employee> query = session.createQuery("from Employee where id > 100", Employee.class);
Stream<Employee> stream = query.stream();
Ikkinchi metod – bu executeUpdate() metodi. Siz ma'lumotlar bazasida nimadir o'zgartiradigan so'rovni yozishingiz mumkin. Bunday holatda Hibernate ma'lumotlar bazasiga murojaat qilinganda read-only tranzaksiyasini ishlatmasligi kerak.
So'rov misoli: biz barcha foydalanuvchilarning darajasini 1 ga oshirmoqchi bo'ldik.
Query<User> query = session.createQuery("update User set level=level+1", User.class);
int count = query.executeUpdate();
executeUpdate() metodi haqiqatan o'zgartirilgan satrlar sonini qaytaradi.
Va nihoyat uchinchi metod – bu scroll(). Bu haqida biroz batafsilroq gapiramiz.
2.3 Scroll klassi metodlari
Ushbu metod stream() metodiga bir oz o'xshaydi. Faqat u natijalar ro'yxati bo'ylab harakat qilish imkonini beradi, natijalarni umuman chiqarib bermasdan. Demak, siz so'rovni bajarishingiz mumkin, keyin uni millioninchi natija satriga o'tkazing va u yerdan boshlab ma'lumotlarni o'qishni boshlang.
Bunday ilg'or iterator.
Query<Employee> query = session.createQuery("from Employee where id > 100", Employee.class);
ScrollableResults<Employee> scroll = query.scroll();
ScrollableResults ob'ektida quyidagi metodlar mavjud:
| Метод | Ta'rif |
|---|---|
| R get() | Joriy elementni qaytaradi |
| next() | Ko'rsatkichi keyingi elementga ko'chiradi |
| previous() | Ko'rsatkichi oldingi elementga ko'chiradi |
| scroll(int size) | size satrga oldinga o'tkazadi |
| position(int pos) | Joriy elementni pos raqamli elementga o'rnatadi |
| last() | Joriy element endi oxirgi |
| first() | Joriy element endi birinchi |
| getRowNumber() | Joriy satr raqamini qaytaradi |
| setRowNumber() | Joriy satr raqamini o'rnatadi |
Faraz qilaylik, siz so'rovni bajardingiz va oxirgi elementni olishni xohlaysiz. Buni qanday qilish mumkin:
Query<Employee> query = session.createQuery("from Employee where id > 100", Employee.class);
ScrollableResults<Employee> scroll = query.scroll();
scroll.last();
Employee lastEmployee = scroll.get();
GO TO FULL VERSION