გვერდებთან მუშაობა: LIMIT და OFFSET
ძალიან ხშირად მონაცემთა ბაზიდან მონაცემები "გვერდებით" იშლება. რადგან სწორედ ასეა მოხერხებული დიდი სიებით მუშაობა. ჯერ მოვითხოვთ სტრიქონებს 1-დან 20-მდე, შემდეგ 21-დან 40-მდე და ასე შემდეგ.
ეს იმდენად გავრცელებული სიტუაციაა, რომ SQL-ში გაჩნდა სპეციალური ოპერატორები LIMIT და OFFSET.
ამ ოპერატორების ანალოგები არის Hibernate-შიც. ისინი მაშინვე გადაწყვიტეს ცალკე მეთოდების სახით გაეკეთებინათ:
- setFirstResult() – ანალოგი OFFSET-ის.
- setMaxResults() – ანალოგი LIMIT-ის.
ამ მეთოდების გამოყენებით მოთხოვნების დაწერა ძალიან მარტივია. მოდი დავწეროთ მოთხოვნა, სადაც ვთხოვთ 41-დან 20 დავალებას დაბრუნებას. აი, ასე გამოიყურება ეს:
Query<EmployeeTask> query = session.createQuery( “from EmployeeTask”, EmployeeTask.class);
query.setFirstResult(41);
query.setMaxResults(20);
List<EmployeeTask> resultLIst = query.list();
შედეგების დალაგება
როგორ მივიღოთ მოთხოვნის შედეგების ნაწილი, გავარკვიეთ. შემდეგი გადაუდებელი საკითხია - დალაგება.
დალაგება Hibernate-ში იწერება პირდაპირ HQL-მოთხოვნაში და სრულიად მოსალოდნელად გამოიყურება:
from Employee order by joinDate
თუ გინდა დალაგების წესის შეცვლა, მაშინ უნდა გამოიყენო ნაცნობი სიტყვები: asc და desc. მაგალითი:
from Employee order by joinDate desc
ისევე, როგორც SQL-ში, შეგიძლია დალაგება რამდენიმე ველზე:
from Employee order by joinDate desc, name asc
გარდა ამისა, დალაგების ველი შეიძლება გადაეცეს როგორც პარამეტრი:
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-ში
ისევე, როგორც SQL-ში, HQL-ში შესაძლებელია სხვადასხვა ფუნქციების გამოყენება.
აი, აგრეგატული ფუნქციების სია, რომლებსაც HQL მხარს უჭერს:
აგრეგატული ფუნქციები | აღწერა |
---|---|
count() | აბრუნებს სტრიქონების რაოდენობას |
sum() | ითვლის მნიშვნელობების ჯამს |
min() | აბრუნებს მინიმალურ მნიშვნელობას |
max() | აბრუნებს მაქსიმალურ მნიშვნელობას |
avg() | აბრუნებს საშუალო მნიშვნელობას |
როგორც წესით გახსოვს, აგრეგატული ფუნქციები, – ესენი ის ფუნქციებია, რომლებიც შეიძლება გამოიყენო group by-თან ერთად. Group By მუშაობს სრულიად ისე, როგორც SQL-ში, ამიტომ არ გავიმეორებთ.
და, რა თქმა უნდა, ჩვეულებრივი ფუნქციები. ჩვეულებრივ ფუნქციებთან ყველაფერი ბევრად მარტივია – მათი შესრულება ახორციელდება SQL-server-ის მიერ, Hibernate-ს უბრალოდ სწორად უნდა გენერირდეს მოთხოვნა მათი გამოყენებით.
ამიტომ Hibernate მხარს უჭერს ყველა იმ ფუნქციას, რომელსაც SQL-server-ი უჭერს. ხოლო SQL-server-ის ტიპი განისაზღვრება sqlDialect პარამეტრით, როდესაც კონფიგურირებ SessionFactory-ს.
მოდით ვიპოვოთ დავალებების რაოდენობა, რომლებიც მომხმარებელს აქვს მინიჭებული:
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();
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ