Hibernate Query Language (HQL) là một ngôn ngữ truy vấn hướng đối tượng, tương tự như SQL, nhưng thay vì hoạt động trên các bảng và các cột, HQL làm việc với các các đối tượng persistent và thuộc tính của chúng. Truy vấn HQL được chuyển đổi bởi Hibernate vào các truy vấn SQL thông thường sau đó lại thực hiện trên cơ sở dữ liệu.
Mặc dù bạn có thể sử dụng câu lệnh SQL trực tiếp với Hibernate bằng cách sử dụng SQL Native nhưng tốt nhất nên sử dụng HQL để tránh việc làm cho cơ sở dữ liệu thêm phức tạp, và để tận dụng lợi thế của các chiến lược tạo bộ nhớ đệm của Hibernate.
Các từ khóa như SELECT, FROM và WHERE,… không phân biệt hoa thường nhưng các thuộc tính như bảng và cột tên là phân biệt hoa thường trong HQL.
2.3.7.1 Mệnh đề FROM
Các truy vấn Hibernate đơn giản nhất: from eg.Cat
Trả về tất cả các trường của lớp eg.Cat. Bạn thường không cần phải đặt điều kiện tên lớp. Ví dụ như:
41 from Cat
Truy vấn có thể đặt lại tên cho lớp Cat và bạn có thể sử dụng tên này cho truy vấn from Cat as cat
2.3.7.2 Associations and Joins
Bạn cũng có thể gán bí danh cho các đối tượng có liên quan hoặc các yếu tố của tập các giá trị sử dụng joins với nhau. Ví dụ như:
from Cat as cat
inner join cat.mate as mate left outer join cat.kittens as kitten
from Cat as cat left join cat.mate.kittens as kittens from Formula form full join form.parameter param
Các loại hỗ trợ tham gia được vay mượn từ ANSI SQL: inner join
left outer join right outer join
full join (not usually useful)
2.3.7.3 Hình thức của cú pháp Joins
HQL hỗ trợ hai hình thức liên kết gia nhập: tuyệt đối và rõ ràng.
Các truy vấn được hiển thị trong phần trước sử dụng tất cả các hình thức rõ ràng, các từ khóa được sử dụng một cách rõ ràng trong mệnh đề From. Đây là hình thức khuyến khích.
Các hình thức tuyệt đối không sử dụng các từ khóa Join. Thay vào đó, các Associations được sử dụng dấu chấm-ký hiệu. Join tuyệt đối có thể xuất hiện ở bất kỳ câu truy vấn HQL. Kết quả join tuyệt đối trong inner joins trong kết quả các lệnh SQL. from Cat as cat where cat.mate.name like '%s%'
2.3.7.4 Mệnh đề Select
Mệnh đề Select giúp chọn bảng hoặc thuộc tính tiêu biểu để trả về kết quả truy vấn select mate
from Cat as cat
42
Truy vấn có thể trở nhiều đối tượng và / hoặc thuộc tính như một mảng kiểu Object []: select mother, offspr, mate.name
from DomesticCat as mother inner join mother.mate as mate left outer join mother.kittens as offspr
2.3.7.5 Các hàm tổng hợp
Truy vấn HQL có thể trả lại kết quả của các chức năng tổng hợp về thuộc tính: select avg(cat.weight), sum(cat.weight), max(cat.weight), count(cat)
from Cat cat
Các chức năng tổng hợp được hỗ trợ là: avg(...), sum(...), min(...), max(...) count(*)
count(...), count(distinct ...), count(all...)
Các distinct cũng có thể được sử dụng và có ngữ nghĩa tương tự như trong SQL. select distinct cat.name from Cat cat
select count(distinct cat.name), count(cat) from Cat cat
2.3.7.6 Mệnh đề Where
Mệnh đề Where cho phép bạn lọc danh sách các trường hợp trả lại. from Cat as cat where cat.name='Fritz'
from bank.Account account
where account.owner.id.country = 'AU'
and account.owner.id.medicareNumber = 123456
2.3.7.7 Các biểu thức
Thuật ngữ dùng trong mệnh đề bao gồm: Toán tử toán học: +, -, *, /
Toán tử so sánh nhị phân: =,> =, <=, <>, =, như Logic: and, or, not.
Dấu ngoặc đơn () chỉ ra rằng nhóm in, not in, between, is null, is not null, is empty, is not empty, member of and not member of
43
"Simple" case, case ... when ... then ... else ... end, and "searched" case, case when ... then ... else ... end
string concatenation ...||... or concat(...,...)
current_date(), current_time(), and current_timestamp()
second(...), minute(...), hour(...), day(...), month(...), and year(...)
Bất kỳ chức năng hoặc hệ thống theo quy định của EJB QL-3.0: substring(), trim(), lower(), upper(), length(), locate(), abs(), sqrt(), bit_length(), mod()
coalesce() and nullif()
str () để chuyển đổi các giá trị số hoặc thời gian để có thể đọc được một chuỗi
cast(... as ...), nơi mà các đối số thứ hai là tên của một loại Hibernate, và trích xuất (... từ ...) nếu ANSI cast () và extract() được hỗ trợ bởi các cơ sở dữ liệu cơ bản
from DomesticCat cat where cat.name in ( 'Foo', 'Bar', 'Baz' ) select mother from Cat as mother, Cat as kit
where kit in elements(foo.kittens)
2.3.7.8 Mệnh đề Order by
Danh sách trả về từ truy vấn có thể được sắp xếp theo bất kỳ thuộc tính của một lớp hoặc các thành phần. Bạn có thể đặt các kết quả của bất kỳ thuộc tính của một lớp hoặc tăng dần (ASC) hoặc giảm dần (DESC). Sau đây là cú pháp đơn giản của việc sử dụng mệnh đề ORDER BY:
from DomesticCat cat
order by cat.name asc, cat.weight desc, cat.birthdate
2.3.7.9 Mệnh đề Group by
Mệnh đề này cho phép Hibernate lấy thông tin từ các cơ sở dữ liệu và nhóm nó dựa trên một giá trị của một thuộc tính và, thông thường, sử dụng kết quả bao gồm tổng giá trị. Sau đây là cú pháp đơn giản của việc sử dụng mệnh đề GROUP BY:
select cat.color, sum(cat.weight), count(cat) from Cat cat
group by cat.color
44