Hibernate Annotation with HQL & Hibernate query language : HQL HQL à¸،ีลัà¸پษณะเป็นcase-insensitive

  • View
    0

  • Download
    0

Embed Size (px)

Text of Hibernate Annotation with HQL & Hibernate query language : HQL HQL...

  • Hibernate Annotation with

    HQL & SQL

  • HQL

    HQL ยอ่มาจาก Hibernate Query Language เป็นภาษาสอบถามเชิงวตัถุท่ีใช้

    สาํหรับจดัการขอ้มูลในฐานขอ้มูลท่ีมีลกัษณะคลา้ยกบัภาษา SQL

    ข้อแตกต่างระหวา่ง SQL และ HQL ท่ีสาํคญั ๆ สามารถสรุปไดด้งัต่อไปน้ี

    SQL มีพ้ืนฐานการทาํงานมาจากระบบฐานขอ้มูลเชิงสัมพนัธ์ ในขณะท่ี

    HQL เป็นการทาํงานท่ีอาศยัหลกัการเชิงวตัถุร่วมกบัแนวคิดของ

    ฐานขอ้มูลเชิงสัมพนัธ์

    SQL ใชจ้ดัการขอ้มูลท่ีถูกบนัทึกลงในตารางและมีการแกไ้ขผา่น

    คอลมัน์และแถว ขณะท่ี HQL เป็นการทาํงานท่ีเก่ียวขอ้งกบัออ็บเจกต์

    และแอททริบิวตท่ี์ถูกกาํหนดไว้

    SQL ใชก้ารทาํงานจากความสัมพนัธ์ท่ีเกิดข้ึนระหวา่งตาราง ในขณะท่ี

    HQL จะใชก้ารทาํงานจากความสัมพนัธ์ระหวา่งออ็บเจกต์

  • Hibernate query language : HQL

    HQL มีลกัษณะเป็น case-insensitive ยกเวน้ในกรณีท่ีมีการอา้งถึงช่ือคลาส

    และช่ือตวัแปรในจาวา

    From Clause: มีลกัษณะเดียวกบั select clause ใน SQL

    Join Clause: HQL สนบัสนุนการทาํงานประเภท Join ไดแ้ก่ inner join,

    left outer join, right outer join และ full join

    Aggregate ฟังกช์ัน่ : count(*), count(distinct x), min(), max(), avg()

    และ sum()

    Expressions: HQL สนบัสนุนนิพจน์ทางคณิตศาสตร์ (+, -, *, /) การ

    เปรียบเทียบ Binay (=, >=,

  • Query interface

    เป็นอ็อบเจกต์ท่ีถูกสร้างข้ึนจากการเรียกใช้เมธอด createQuery() จาก

    Session ประกอบไปดว้ยเมธอดหลกั ๆ ดงัน้ี

    public int executeUpdate() ใชป้ระมวลผลคิวรี update หรือ delete

    public List list() คืนค่าผลลพัธ์จากตารางในรูปของ list

    public Query setFirstResult(int rowno) ระบุจาํนวนแถวท่ีอ่านขอ้มูล

    public Query setMaxResult(int rowno) ระบุจาํนวนแถวขอ้มูลท่ี

    ตอ้งการอ่านจากตาราง

    public Query setParameter(int position, Object value) ใชส้าํหรับ

    กาํหนดค่าตาํแหน่งพารามิเตอร์ตามรูปแบบการคิวรีขอ้มูล

    public Query setParameter(String name, Object value) ใชก้าํหนด

    ช่ือพารามิเตอร์ร่วมกบัการคิวรีขอ้มูล

  • Part of Student Class @Entity @Table (name="STUDENT") public class Student {

    @Id @GeneratedValue private int studentId; private String studentName; private String major; private double gpa;

    public Student() {}

    public Student( String studentName, String major, double gpa) { this.studentName = studentName; this.major = major; this.gpa = gpa;

    } public String toString() {

    return " "+studentId+ " "+studentName + " "+major + " "+ gpa; }

    }

  • FROM Clause

    เป็นรูปแบบ HQL คิวรีท่ีใชโ้หลด Persistent ออ็บเจกตเ์ขา้สู่หน่วยความจาํ

    โดยมีรูปแบบการใชค้าํสั่งท่ีคลา้ยกบัภาษา SQL ดงัน้ี

    การใช้ HQL ตอ้งผา่น Query ออ็บเจกตท่ี์ประกอบไปดว้ยเมธอดต่าง ๆ ท่ีใช้

    ในการควบคุมการประมวลผลคิวรีต่าง ๆ ดงัตวัอยา่งคาํสั่งต่อไปน้ี

    HQL SQL

    FROM Student Select * from Student

    String hql = "FROM Student"; Query query = session.createQuery(hql); List students = query.list();

  • list() : HQL

    ส่วนเมธอด list() ใชส้าํหรับคืนค่าผลลพัธ์จากการคิวรีในรูปกลุ่มขอ้มูลท่ีถูก

    จดัเกบ็ภายใน List ดงัตวัอยา่งคาํสั่งต่อไปน้ี

    String hql = "FROM Student"; Query query = session.createQuery(hql); List students = query.list(); System.out.println("Student Details: ");

    for(Student stu: students) { System.out.println(stu);

    }

    1 Somchai Jaidee Information Technology 2.75 2 Somsri Jaipak Computer Science 3.1 3 Somrak Jaijing Information Technology 2.5 4 Somying Jaimon Computer Science 3.12

  • list() : SQL

    ส่วนเมธอด list() ของ SQL ใชส้าํหรับคืนค่าผลลพัธ์จากการคิวรีในรูปกลุ่ม

    ขอ้มูลภายใน Object[] ผูใ้ชต้อ้งแยกผลลพัธ์จากคาํสั่งดว้ยตวัเอง ดงัตวัอยา่ง

    คาํสั่งต่อไปน้ี

    SQLQuery query = session.createSQLQuery("select * from Student");

    List student = query.list(); System.out.println("Student Details: ");

    for(Object[] row : student){ System.out.print("Student ID: "+ row[0]); System.out.print(" Name: "+ row[1]); System.out.println(" Major: "+row[2]); System.out.println(" and GPA: "+row[3]);

    }

    ขอ้มูล row ข้ึนอยูก่บัลาํดบัของ

    ขอ้มูลภายในตารางฐานขอ้มูล

  • WHERE Clause

    ใช้ในกรณีที่ต้องการจํากัดผลลัพธ์ของการคิวรีให้แคบลงผู้ใชส้ามารถใช ้

    WHERE clause เพ่ือปรับแกผ้ลลพัธ์ของออ็บเจกตท่ี์ตอ้งการคืนค่า โดยมี

    รูปแบบการใชง้านดงัตวัอยา่งคาํสั่งต่อไปน้ี

    String hql = "FROM Student where studentId = 3"; Query query = session.createQuery(hql); List students = query.list(); System.out.println("Student Details: ");

    for(Student stu: students) { System.out.print(stu);

    }

    3 Somrak Jaijing Information Technology 2.5

  • SELECT Clause

    คําส่ังน้ีช่วยให้การควบคุมผลลัพธ์จากการทํางานทําได้ดีกว่ า from clause

    ในกรณีท่ีต้องการอ่านค่า properties ของ objects ภายใน result ใหใ้ช้ select

    clause

    ตัวอย่างเช่น ในกรณีท่ีต้องการอ่านค่าเฉพาะช่ือของ Student เท่านั้น ผูใ้ชไ้ม่

    จาํเป็นตอ้งอ่านค่าจากออ็บเจกตท์ั้งหมด ดงั select clause ต่อไปน้ี

    String hql = "SELECT S.name FROM Student S"; Query query = session.createQuery(hql); List names = query.list();

    for(String stu: names) { System.out.println("Student name: "+ stu.toString());

    }

  • Named Parameters

    Hibernate สนบัสนุนการใชช่ื้อของพารามิเตอร์ในการคิวรีขอ้มูล เพ่ือเพิ่ม

    ความสะดวกในการเขียน HQL คิวรีรับขอ้มูลอินพตุจากผูใ้ช้

    เช่นใ นกรณีท่ีต้องการคิวรีข้อมูลเฉพาะ Student ท่ีมีค่า studentId เท่ากบั 1

    สามารถใชค้าํสั่ง setParameter() เพ่ือกาํหนดช่ือตวัแปร stu_id แทนได้

    String hql = "FROM Student S WHERE S.studentId = :stu_id";

    Query query = session.createQuery(hql); query.setParameter("stu_id",(