การทำงานกับเพจ: LIMIT และ OFFSET

บ่อยครั้งมาก ข้อมูลจากฐานข้อมูลถูกเรียกค้นใน "เพจ" เพราะนั่นเป็นวิธีที่สะดวกในการทำงานกับรายการขนาดใหญ่ เราจะค้นหาแถวที่ 1 ถึง 20 ก่อน จากนั้นจึงค้นหาแถวที่ 21 ถึง 40 ไปเรื่อยๆ

นี่เป็นสถานการณ์ทั่วไปที่ SQL มีตัวดำเนินการพิเศษสำหรับ LIMIT และ OFFSET นี้

แอนะล็อกของตัวดำเนินการเหล่านี้มีอยู่ในไฮเบอร์เนตด้วย มีเพียงพวกเขาเท่านั้นที่ตัดสินใจทำในรูปแบบของวิธีการแยกกันทันที:

  • setFirstResult ()มีความคล้ายคลึงกับOFFSET
  • setMaxResults()นั้นคล้ายคลึงกับ LIMIT

การเขียนแบบสอบถามด้วยวิธีเหล่านี้ทำได้ง่ายมาก ลองเขียนแบบสอบถามที่เราขอให้ส่งคืน 20 งานโดยเริ่มจาก 41 ซึ่งจะมีลักษณะดังนี้:

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”, “Ivan Ivanovich”);
query.setParameter(“ord”, “name”);

List<EmployeeTask> resultLIst = query.list();

ฟังก์ชั่นใน HQL

เช่นเดียวกับใน SQL ใน HQL คุณสามารถใช้ฟังก์ชันต่างๆ

นี่คือรายการของฟังก์ชันรวมที่ HQL รองรับ:

ฟังก์ชันรวม คำอธิบาย
นับ() ส่งกลับจำนวนแถว
ผลรวม () คำนวณผลรวมของค่า
นาที() ส่งกลับค่าต่ำสุด
สูงสุด () ส่งกลับค่าสูงสุด
เฉลี่ย () ส่งกลับค่าเฉลี่ย

อย่างที่คุณหวังว่าจะจำได้ ฟังก์ชันรวมเป็นฟังก์ชันที่สามารถใช้ร่วมกับการจัดกลุ่มตาม Group By ทำงานเหมือนกับใน SQL ดังนั้นเราจะไม่ทำซ้ำ

และแน่นอนฟังก์ชั่นปกติ . ด้วยฟังก์ชันทั่วไป ทุกอย่างจะง่ายกว่ามาก - ดำเนินการโดยเซิร์ฟเวอร์ SQL ไฮเบอร์เนตจำเป็นต้องสร้างคิวรีอย่างถูกต้องโดยใช้เท่านั้น

ดังนั้น Hibernate จึงรองรับฟีเจอร์ทั้งหมดที่ SQL Server รองรับ และประเภทของเซิร์ฟเวอร์ SQL ถูกกำหนดโดยพารามิเตอร์ sqlDialect เมื่อคุณกำหนดค่า SessionFactory ของคุณ

มาหาจำนวนงานที่กำหนดให้ผู้ใช้:

String hql = "select count(*) from EmployeeTask where employee.name = :username ";
Query<Integer> query = session.createQuery( hql, Integer.class);
query.setParameter(“username”, “Ivan Ivanovich”);
Integer count = query.uniqueResult();