JavaRush /Kurslar /All lectures for UZ purposes /Query klassini o'rganamiz

Query klassini o'rganamiz

All lectures for UZ purposes
Daraja, Dars
Mavjud

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();
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION