1.1 Pengenalan kepada HQL
Sebelum ini, anda telah berkenalan dengan Hibernate, dan sekarang saya akan memperkenalkan anda kepada HQL , aka Hibernate Query Language . Sebenarnya, ini adalah SQL yang ditukar untuk menulis pertanyaan dalam Hibernate. Ia mempunyai beberapa perbezaan utama.
- Menggunakan nama kelas dan bukannya nama jadual.
- Menggunakan nama medan kelas dan bukannya nama lajur jadual.
- Penggunaan pilihan pilihan.
Mari minta Hibernate untuk mengembalikan kepada kami semua pengguna yang ada dalam pangkalan data. Begini rupa permintaan itu:
from User
Itu sahaja, sebagai perbandingan, kami membentangkan pertanyaan serupa dalam SQL:
select * from user
Berikut User
ialah nama kelas, dan user
ialah nama jadual.
Kod Java lengkap akan kelihatan seperti ini:
public List<User> getAllUsers() {
try (Session session = sessionFactory.openSession()) {
return session.createQuery("from User", User.class).list();
}
}
Jika tidak, HQL sangat serupa dengan SQL - ia juga mempunyai pengendali:
WHERE
ORDER BY
GROUP BY
HAVING
1.2 Contoh bekerja dengan HQL
Mungkin contoh sebelumnya agak mengelirukan kerana nama jadual dan medan yang sama. Mari kita dapatkan contoh khas di mana ini akan menjadi lebih mudah.
Katakan kita mempunyai jadual user_data yang mengandungi medan berikut:
- id INT
- nama pengguna VARCHAR(100)
- INT peringkat_pengguna
- pengguna_dicipta DATE
Kami akan membuat kelas Java yang akan dipetakan ke jadual ini:
@Entity
@Table(name="user_data")
class User {
@Id
@GeneratedValue
public Integer id;
@Column(name="user_name")
public String name;
@Column(name="user_level")
public Integer level;
@Column(name="user_created")
public Date created;
}
Sekarang mari kita tulis beberapa contoh:
HQL | SQL |
---|---|
daripada Pengguna | pilih * daripada data_pengguna |
daripada Pengguna di mana id=3 | pilih * daripada data_pengguna di mana id=3 |
daripada Pengguna di mana tahap dalam (10,20,30) | pilih * daripada data_pengguna di mana peringkat_pengguna IN (10, 20, 30) |
daripada Pesanan pengguna dengan dibuat asc | pilih * daripada pesanan_data pengguna mengikut pengguna_dicipta asc |
dari Pengguna di mana nama seperti 'ujian' | pilih * daripada data_pengguna di mana nama_pengguna seperti 'ujian' |
Pertanyaannya sangat serupa, dan membaca pertanyaan HQL apabila anda sudah biasa dengan nama kelas dan medannya adalah semudah membaca pertanyaan SQL. Ia mungkin sedikit lebih sukar untuk menulis, tetapi sekali lagi, pertanyaan yang sangat kompleks jarang ditulis dalam HQL.
1.3 Menggunakan pilih
Dalam HQL, anda boleh gunakan select
apabila jenis data hasil tidak sepadan dengan jenis yang dinyatakan dalam from
.
Sebagai contoh, kami ingin mendapatkan nama semua pengguna yang terdapat dalam jadual user_data kami , maka kami perlu menulis pertanyaan berikut:
select name from User
Juga, jika terdapat pendua antara nama, maka anda boleh menggunakan operator DISTINCT
:
select distinct name from User
Alias berfungsi sama seperti dalam SQL:
select distinct u.name from User u where u.created > '2020-01-01'
Nah, sepenuhnya dalam bentuk kod Java, permintaan ini akan kelihatan seperti ini:
public List<String> getUserNames() {
try (Session session = sessionFactory.openSession()) {
String hql = "select distinct u.name from User u where u.created > '2020-01-01'";
Query<String> query = session.createQuery(hql , String.class);
return query.list();
}
}
Ambil perhatian bahawa pertanyaan mesti mengembalikan senarai nama. Nama adalah jenis String, jadi kedua-dua jenis fungsi dan parameter jenis kelas Query adalah jenis String.
GO TO FULL VERSION