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.

  1. Menggunakan nama kelas dan bukannya nama jadual.
  2. Menggunakan nama medan kelas dan bukannya nama lajur jadual.
  3. 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 Userialah nama kelas, dan userialah 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 selectapabila 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.