1.1 Pengantar HQL

Sebelumnya, Anda sudah mengenal Hibernate, dan sekarang saya akan memperkenalkan Anda ke HQL , alias Hibernate Query Language . Faktanya, ini adalah SQL yang dikonversi untuk menulis kueri di Hibernate. Ini memiliki beberapa perbedaan utama.

  1. Menggunakan nama kelas bukan nama tabel.
  2. Menggunakan nama bidang kelas , bukan nama kolom tabel.
  3. Opsional penggunaan pilih.

Mari kita minta Hibernate untuk mengembalikan kepada kita semua pengguna yang ada di database. Seperti inilah permintaan itu:

from User

Itu saja, sebagai perbandingan, kami menyajikan kueri serupa di SQL:

select * from user

Berikut Useradalah nama kelasnya, dan usermerupakan nama tabelnya.

Kode Java lengkap akan terlihat seperti ini:


public List<User> getAllUsers() {
    try (Session session = sessionFactory.openSession()) {
            return session.createQuery("from User", User.class).list();
    }
}

Kalau tidak, HQL sangat mirip dengan SQL - ia juga memiliki operator:

  • WHERE
  • ORDER BY
  • GROUP BY
  • HAVING

1.2 Contoh bekerja dengan HQL

Mungkin contoh sebelumnya agak membingungkan karena nama tabel dan fieldnya sama. Mari kita berikan contoh khusus di mana ini akan lebih mudah.

Katakanlah kita memiliki tabel user_data yang berisi bidang-bidang berikut:

  • id INT
  • nama pengguna VARCHAR(100)
  • pengguna_tingkat INT
  • TANGGAL user_created

Kami akan membuat kelas Java yang akan dipetakan ke tabel 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
dari Pengguna pilih * dari user_data
dari Pengguna di mana id=3 pilih * dari user_data dimana id=3
dari Pengguna di mana level dalam (10,20,30) pilih * dari user_data dimana user_level IN (10, 20, 30)
dari pesanan Pengguna dengan membuat asc pilih * dari urutan user_data oleh user_created asc
dari Pengguna di mana nama seperti 'tes' pilih * dari user_data mana user_name seperti 'test'

Kuerinya sangat mirip, dan membaca kueri HQL saat Anda terbiasa dengan nama kelas dan bidangnya semudah membaca kueri SQL. Mungkin sedikit lebih sulit untuk ditulis, tetapi sekali lagi, kueri yang sangat kompleks jarang ditulis dalam HQL.

1.3 Menggunakan pilih

Di HQL, Anda dapat menggunakan selectketika tipe data hasil tidak cocok dengan tipe yang ditentukan dalam from.

Misalnya, kami ingin mendapatkan nama semua pengguna yang ada di tabel user_data kami , maka kami perlu menulis kueri berikut:

select name from User

Juga, jika ada duplikat di antara nama-nama tersebut, Anda dapat menggunakan operator DISTINCT:

select distinct name from User

Alias ​​bekerja sama seperti di SQL:

select distinct u.name from User u where u.created > '2020-01-01'

Nah, lengkapnya berupa kode Java, request ini akan terlihat 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();
    }
}

Perhatikan bahwa kueri harus mengembalikan daftar nama. Nama bertipe String, jadi baik tipe fungsi maupun parameter tipe kelas Query bertipe String.