Sahifalar bilan ishlash: LIMIT va OFFSET
Ko'p hollarda ma'lumotlar bazasidan ma'lumotlar "sahifalar" shaklida chiqariladi. Bu katta ro'yxatlar bilan ishlashda qulay. Avval 1-dan 20-gacha satrlarni so'raymiz, keyin 21-dan 40-gacha va boshqalar.
Bu shunchalik keng tarqalgan holatki, SQL'da LIMIT va OFFSET maxsus operatorlari paydo bo'ldi.
Bu operatorlarning analoglari Hibernate'da ham mavjud. Faqat ular darhol alohida metodlar shaklida qilindi:
- setFirstResult() – OFFSET analogi.
- setMaxResults() – LIMIT analogi.
Bu metodlardan foydalangan holda so'rovlarni yozish juda oson. Keling, 41-dan boshlab 20 ta vazifani qaytarishni so'rovchi so'rov yozamiz. Bu qanday ko'rinishga ega bo'ladi:
Query<EmployeeTask> query = session.createQuery( “from EmployeeTask”, EmployeeTask.class);
query.setFirstResult(41);
query.setMaxResults(20);
List<EmployeeTask> resultLIst = query.list();
Natijalarni saralash
Biz so'rov natijasini qanday qismida olishni tushundik. Keyingi dolzarb savol – saralash.
Hibernate'da saralash HQL-so'rovda to'g'ridan-to'g'ri yoziladi va umuman kutganingizdek ko'rinadi:
from Employee order by joinDate
Agar siz saralash tartibini o'zgartirmoqchi bo'lsangiz, tanish so'zlarni ishlatishingiz kerak: asc va desc. Misol:
from Employee order by joinDate desc
Xuddi SQL'da bo'lgani kabi, siz bir nechta maydonlarga ko'ra saralash qilishingiz mumkin:
from Employee order by joinDate desc, name asc
Bundan tashqari, saralash uchun maydonni parametr sifatida uzatishingiz mumkin:
String hql = "from EmployeeTask where employee.name = :username order by :ord";
Query<EmployeeTask> query = session.createQuery( hql, EmployeeTask.class);
query.setParameter(“username”, “Иван Иванович”);
query.setParameter(“ord”, “name”);
List<EmployeeTask> resultLIst = query.list();
HQL'dagi funksiyalar
Xuddi SQL'da bo'lgani kabi HQL'da ham turli xil funksiyalarni ishlatishingiz mumkin.
Mana HQLni qo'llab-quvvatlaydigan agregat funksiyalarining ro'yxati:
| Agregat funksiyalari | Tavsifi |
|---|---|
| count() | Qatorlar sonini qaytaradi |
| sum() | Qiymatlar yig'indisini hisoblaydi |
| min() | Minimal qiymatni qaytaradi |
| max() | Maksimal qiymatni qaytaradi |
| avg() | O'rtacha qiymatni qaytaradi |
Umid qilamanki, yodda tutyapsiz, agregat funksiyalar – bu group by bilan ishlatish mumkin bo'lgan funksiyalar. Group By SQL'da qanday ishlasa, xuddi shunday ishlaydi, shuning uchun takrorlanmaymiz.
Va, albatta, oddiy funksiyalar. Oddiy funksiyalar bilan hammasi ancha oson – ularni SQL-server bajaradi, Hibernate’ga faqat to'g'ri so'rovni ularni ishlatib yaratish kerak.
Shuning uchun Hibernate SQL-server tomonidan qo'llab-quvvatlanadigan barcha funksiyalarni qo'llab-quvvatlaydi. SQL-server turi esa SessionFactory ni sozlash chog'ida sqlDialect parametri orqali belgilanadi.
Keling, bir foydalanuvchiga belgilangan vazifalar sonini topamiz:
String hql = "select count(*) from EmployeeTask where employee.name = :username ";
Query<Integer> query = session.createQuery( hql, Integer.class);
query.setParameter(“username”, “Иван Иванович”);
Integer count = query.uniqueResult();
GO TO FULL VERSION