Hibernate Query Language (HQL) adalah bahasa kueri berorientasi objek yang mirip dengan SQL, tetapi tidak operasi pada tabel dan kolom. HQL cocok untuk objek persisten dan propertinya. Kueri HQL dikonversi dari hibernate ke kueri SQL tradisional, yang melakukan operasi pada database pada lingkaran.
Meskipun dimungkinkan untuk menggunakan SQL asli secara langsung dengan pernyataan SQL dan hibernasi, disarankan untuk menggunakan HQL untuk menghindari kerumitan portabilitas basis data sebanyak mungkin dan mengadopsi keuntungan dari generasi SQL dan strategi caching Hibernate.
Kata kunci seperti SELECT, dari dan di mana peka case, tetapi sifat-sifat seperti nama tabel dan nama kolom dibedakan dalam HQL sensitif.
Dari pernyataan
Gunakan klausa From jika Anda ingin memuat objek persisten lengkap ke dalam memori. Berikut adalah sintaks sederhana menggunakan klausa dari:
String hql = "from employee"; kueri kueri = session.createqueery (hql); daftar hasil = query.list ();Jika Anda perlu sepenuhnya memenuhi syarat nama kelas di HQL, tentukan saja paket dan nama kelas berikut:
String hql = "dari com.hibernateBook.criteria.employee"; query kueri = session.createquery (hql); daftar hasil = query.list ();
Sebagai pernyataan
Klausa AS dapat digunakan untuk dialokasikan untuk kueri HQL di kelas, terutama ketika ada pertanyaan yang sangat lama. Misalnya, contoh singkat kami di atas adalah sebagai berikut:
String hql = "dari karyawan sebagai e"; kueri kueri = session.createqueery (hql); daftar hasil = query.list ();
Kata kunci AS adalah opsional, dan Anda juga dapat menentukan alias secara langsung dalam nama kelas berikutnya, seperti yang ditunjukkan di bawah ini:
String hql = "dari karyawan e"; kueri kueri = session.createqueery (hql); daftar hasil = query.list ();
Pilih Klausa
Klausa Pilih memberikan lebih banyak kontrol daripada set hasil dari klausa dari. Jika Anda ingin mendapatkan beberapa properti objek alih -alih seluruh objek, gunakan klausa pilih. Berikut adalah sintaks sederhana untuk menggunakan pernyataan pilih untuk mendapatkan objek karyawan hanya first_name bidang:
String hql = "SELECT E.FirstName dari karyawan E"; query query = session.createQuery (hql); daftar hasil = query.list ();
Perlu dicatat bahwa di sini, karyawan. FirstName adalah atribut dari objek karyawan, bukan bidang tabel karyawan.
Dimana klausa
Jika Anda ingin mempersempit objek spesifik yang dikembalikan dari penyimpanan, Anda dapat menggunakan klausa Where. Berikut adalah sintaksis sederhana menggunakan klausa Where:
String hql = "dari karyawan e di mana e.id = 10"; kueri kueri = session.createqueery (hql); daftar hasil = query.list ();
Pesan demi klausa
Untuk mengurutkan hasil kueri HQL, Anda perlu menggunakan Klausul Pesanan demi Klausa. Anda dapat mengurutkan hasil dalam ascending (ASC) atau Descending (desc) dalam hasil yang ditetapkan dengan mengurutkan hasil dalam atribut objek apa pun. Berikut adalah sintaks sederhana menggunakan Klausul Pesanan dengan:
String hql = "Dari karyawan e di mana e.id> 10 pesanan oleh e.salary desc"; query kueri = session.createQuery (hql); daftar hasil = query.list ();
Jika Anda ingin menyortir lebih dari satu properti, Anda hanya akan menambahkan properti tambahan ke akhir perintah yang dipisahkan oleh klausa dengan koma, seperti yang ditunjukkan di bawah ini:
String hql = "dari karyawan e di mana e.id> 10" + "pesanan oleh e.firstname desc, e.salary desc"; kueri kueri = session.createquery (hql); daftar hasil = query.list ();
Kelompok demi klausa
Klausul ini memungkinkan ekstraksi informasi dari database dan kelompok nilai berbasis atribut Hibernate, dan biasanya menggunakan hasilnya untuk memasukkan nilai total. Berikut adalah sintaksis sederhana menggunakan klausa grup dengan:
String hql = "SELECT SUM (e.salary), e.firtname dari karyawan e" + "grup oleh e.firstname"; kueri kueri = session.createqueery (hql); daftar hasil = query.list ();
Gunakan parameter bernama
Hibernate didukung dalam parameter kueri HQL -nya. Ini membuatnya mudah untuk menulis dan menerima masukan dari pengguna tanpa harus bertahan terhadap pertanyaan HQL tentang serangan injeksi SQL. Berikut adalah sintaks sederhana menggunakan parameter bernama:
String hql = "dari karyawan e di mana e.id =: emplingee_id"; query query = session.createquery (hql); query.setParameter ("employee_id", 10); daftar hasil = query.list (); Perbarui Klausa
Pembaruan batch adalah HQL baru dengan Hibernate3, dan pekerjaan penghapusan yang berbeda, sama dengan Hibernate 3 dan Hibernate2. Antarmuka kueri sekarang berisi metode yang disebut executeUpdate () untuk mengeksekusi pembaruan HQL atau pernyataan hapus.
Klausa Pembaruan dapat digunakan untuk memperbarui satu atau lebih properti di satu atau lebih objek. Berikut adalah sintaks sederhana menggunakan klausa pembaruan:
String hql = "Perbarui karyawan set gaji =: gaji" + "di mana id =: querye_id"; kueri kueri = sesi.
Klausul Hapus
Klausa Hapus dapat digunakan untuk menghapus satu atau lebih objek. Berikut adalah sintaks sederhana menggunakan klausa hapus:
String hql = "hapus dari karyawan" + "di mana id =: usaha query"; query kueri = session.createqueery (hql); query.setParameter ("outeee_id", 10); int result = query.executeupdate (); System.out.println ("Baris yang dipengaruhi:" + hasil); Masukkan klausa
HQL mendukung insert ke klausa di mana hanya catatan yang dapat dimasukkan dari satu objek ke objek lainnya. Berikut adalah sintaks sederhana menggunakan klausa insert ke dalam:
String hql = "masukkan ke karyawan (nama pertama, lastname, gaji)" + "pilih firstName, lastname, gaji dari old_employee"; query query = session.createQuery (hql); int result = query.executeUpdate (); System.out.println ("ROWS yang terpengaruh:" + Hasil); Metode Agregasi
HQL mendukung beberapa metode agregasi, mirip dengan SQL. Mereka bekerja di HQL dengan cara yang sama di SQL dan daftar fitur yang tersedia berikut:
Kata kunci yang berbeda hanya menghitung nilai unik yang ditetapkan pada baris ini. Kueri berikut hanya akan mengembalikan jumlah unik:
String hql = "Pilih hitungan (berbeda e.firstname) dari karyawan e"; kueri kueri = session.createquery (hql); daftar hasil = query.list ();
Menggunakan pagination kueri
Ada dua metode untuk antarmuka kueri pagination.
Bersama -sama, Anda dapat membangun komponen paging di situs web atau aplikasi ayunan. Berikut adalah contohnya, Anda dapat memperpanjangnya untuk mendapatkan 10 baris:
String hql = "from quere"; kueri kueri = session.createqueery (hql); query.setFirStresult (1); query.setMaxResults (10); daftar hasil = query.list ();
Kriteria kueri
Hibernate menyediakan cara alternatif untuk mengoperasikan objek dan data berurutan yang tersedia di tabel RDBMS. Salah satu metode adalah API standar, yang memungkinkan Anda untuk membuat pemrograman objek kueri standar yang dapat menerapkan aturan penyaringan dan kondisi logis.
Antarmuka sesi Hibernate menyediakan contoh kelas yang dapat digunakan untuk membuat objek persisten yang dikembalikan, dan aplikasi menjalankan kueri bersyarat untuk metode createCriteria ().
Berikut ini adalah contoh kueri bersyarat paling sederhana yang hanya akan mengembalikan setiap objek yang sesuai dengan kelas karyawan.
Kriteria cr = session.createCriteria (karyawan.class); daftar hasil = cr.list ();
Keterbatasan dan Standar:
Anda dapat menggunakan metode add () untuk menambahkan kueri restriksi menggunakan objek kriteria. Berikut adalah contoh menambahkan batas dengan catatan pengembalian gaji sama dengan 2000:
Kriteria cr = session.createCriteria (karyawan.class); cr.add (pembatasan.eq ("gaji", 2000)); daftar hasil = cr.list ();Berikut adalah beberapa contoh yang mencakup skenario yang berbeda dan dapat digunakan sesuai kebutuhan:
Kriteria cr = session.createCriteria (karyawan.class); // Untuk mendapatkan catatan memiliki gaji lebih dari 2000cr.add (pembatasan.gt ("gaji", 2000)); // untuk mendapatkan catatan memiliki gaji kurang dari 2000cr.add (pembatasan.lt ("gaji", 2000)); // Untuk mendapatkan catatan untuk mulai dengan starting ("gaji", 2000)); zaracr.add (pembatasan. nullcr.add (restrictions.isnull ("gaji")); // untuk memeriksa apakah properti yang diberikan bukan nullcr.add (pembatasan.isnotnull ("gaji"))); // untuk memeriksa apakah properti yang diberikan kosong. kosongcr.add (pembatasan.isnotempty ("gaji")); Anda dapat membuat dan atau ORS menggunakan LogicalExpression untuk membatasi kondisi berikut: kriteria cr = session.createCriteria (karyawan.class); Gaji kriteria = pembatasan.gt ("gaji", 2000); Criterion name = Restrictions.ilike("firstNname","zara%");// To get records matching with OR conditionionsLogicalExpression orExp = Restrictions.or(salary, name);cr.add( orExp );// To get records matching with AND conditionsLogicalExpression andExp = Restrictions.and(salary, name);cr.add( andExp );List results = cr.list ();Meskipun semua kondisi di atas dapat langsung diperkenalkan menggunakan HQL di tutorial sebelumnya.
Standar Penggunaan Paging:
Ada juga antarmuka standar, dua metode untuk pagination.
Bersama dengan dua metode di atas, kami dapat membangun komponen paging di situs web kami atau aplikasi ayunan. Berikut adalah contoh, yang dapat diperpanjang untuk mendapatkan 10 baris sekaligus:
Kriteria cr = session.createCriteria (karyawan.class); cr.setFirstresult (1); cr.setMaxResults (10); daftar hasil = cr.list ();
Urutkan Hasil:
API standar menyediakan org.hibernate.criterion.ordering kelas menyortir hasil Anda diatur dalam urutan naik atau turun, sesuai dengan sifat objek. Contoh ini menunjukkan cara mengurutkan menggunakan set hasil kelas pesanan:
Kriteria cr = session.createCriteria (karyawan.class); // Untuk mendapatkan catatan memiliki penjualan lebih dari 2000cr.add (pembatasan.gt ("gaji", 2000)); // untuk mengurutkan catatan dalam penurunan pesanan. cr.list (); Prediksi dan agregasi:
Kriteria API menyediakan kelas org.hibernate.criterion.projections yang dapat digunakan untuk mendapatkan nilai atribut rata -rata, maksimum atau minimum. Kelas proyeksi mirip dengan batasan kelas karena menyediakan beberapa metode pabrik statis untuk mendapatkan instance proyeksi. Menyediakan
Berikut adalah beberapa contoh yang melibatkan berbagai skema yang dapat digunakan sesuai resep:
Kriteria cr = session.createCriteria (karyawan.class); // Untuk mendapatkan jumlah total baris.cr.setProyproy (proyections.rowcount ()); // untuk mendapatkan rata -rata properti.cr.setProyproy (proyeksi. Property.cr.setProyjection (proyections.max ("gaji")); // untuk mendapatkan minimum properti.cr.setproyjection (proyeksi.min ("gaji")); // untuk mendapatkan jumlah properti.cr.setproadication (proyeksi.sum ("gaji"))); Contoh Kriteria Contoh:
Pertimbangkan kelas pojo berikut:
karyawan kelas publik {private int id; Private String FirstName; Private String LastName; gaji int pribadi; pegawai publik () {} pegawai publik (string fname, string lname, int gaji) {this.firstname = fname; this.lastname = lname; this.salary = gaji; } public int getId () {return id; } public void setid (int id) {this.id = id; } public String getFirstName () {return firstName; } public void setFirstName (String first_name) {this.firstname = first_name; } public String getLastName () {return lastName; } public void setLastName (string last_name) {this.lastname = last_name; } public int getSalary () {return gaji; } public void setSalary (int gaji) {this.salary = gaji; }}Mari kita buat tabel karyawan berikut untuk menyimpan objek karyawan:
Buat tabel karyawan (id int not null auto_increment, first_name varchar (20) default null, last_name varchar (20) default null, gaji int default null, kunci utama (id));
Berikut ini akan dipetakan file.
<? XML Versi = "1.0" encoding = "utf-8"?> <! Doctype hibernate-mapping public "-// hibernate/hibernate pemetaan dtd // en" "http://www.hibernate.org/dtd/hibernate-papping-3.0 <meta attribute = "class-description"> Kelas ini berisi detail karyawan. </meta> <id name="id" type="int" column="id"> <generator/> </id> <property name="firstName" column="first_name" type="string"/> <property name="lastName" column="last_name" type="string"/> <property name="salary" column="salary" type="int"/> </class></hibernate-mapping>
Akhirnya, kami akan membuat metode utama () dari kelas aplikasi untuk dijalankan, dan kami akan menggunakan kueri kriteria untuk aplikasi:
impor java.util.list; impor java.util.date; import java.util.iterator; impor org.hibernate.hibernateException; impor org.hibernate.Session; Impor org.hibernate.transaction; impor org.hibernate.sessionfactory; impor org.hibernate.criteria; impor org.hibernate.criterion.Restrictions; impor org.hibernate.criterion.projections; impor org.hibernate.cfg.onfigurasi kelas publik public static void main (string [] args) {try {factory = new configuration (). configure (). buildSessionFactory (); } catch (Throwable ex) {System.err.println ("Gagal membuat objek SesionFactory." + Ex); Lempar pengecualian baruinitializerError (EX); } Manajemen Me = Manajemen baru (); / * Tambahkan beberapa catatan karyawan dalam database */ integer empid1 = me.addemployee ("zara", "ali", 2000); Integer empid2 = me.addemployee ("daisy", "das", 5000); Integer empid3 = me.addemployee ("John", "Paul", 5000); Integer empid4 = me.addemployee ("mohd", "yasee", 3000); / * Daftar semua karyawan */ me.listemployee (); / * Cetak total karyawan */ me.countemployee (); / * Cetak gaji toatl */ me.totalsalary (); } / * Metode untuk membuat karyawan dalam database * / public integer addEmployee (string fname, string lname, int gaji) {session session = factory.opensession (); Transaksi tx = null; Integer Pegawai = NULL; coba {tx = session.begintransaction (); Karyawan Karyawan = Karyawan Baru (nama, lname, gaji); karyawan = (integer) session.save (karyawan); tx.commit (); } catch (hibernateException e) {if (tx! = null) tx.rollback (); e.printstacktrace (); } akhirnya {session.close (); } mengembalikan karyawan; } / * Metode untuk membaca semua karyawan yang memiliki gaji lebih dari 2000 * / public void listeMireees () {session session = factory.opensession (); Transaksi tx = null; coba {tx = session.begintransaction (); Kriteria cr = session.createCriteria (karyawan.class); // Tambahkan batasan. Cr.Add (pembatasan.gt ("gaji", 2000)); Daftar karyawan = cr.list (); untuk (iterator iterator = karyawan.iterator (); iterator.hasnext ();) {karyawan karyawan = (karyawan) iterator.next (); System.out.print ("Nama Depan:" + karyawan.getFirstName ()); System.out.print ("Nama Belakang:" + karyawan.getLastName ()); System.out.println ("Gaji:" + karyawan.getSalary ()); } tx.Commit (); } catch (hibernateException e) {if (tx! = null) tx.rollback (); e.printstacktrace (); } akhirnya {session.close (); }} / * Metode untuk mencetak jumlah total catatan * / public void counteMireee () {session session = factory.opensession (); Transaksi tx = null; coba {tx = session.begintransaction (); Kriteria cr = session.createCriteria (karyawan.class); // Untuk mendapatkan jumlah baris total. cr.setProyjection (proyections.rowcount ()); Daftar rowcount = cr.list (); System.out.println ("Total Coint:" + RowCount.get (0)); tx.commit (); } catch (hibernateException e) {if (tx! = null) tx.rollback (); e.printstacktrace (); } akhirnya {session.close (); }} / * Metode untuk mencetak jumlah gaji * / public void totalSalary () {session session = factory.opensession (); Transaksi tx = null; coba {tx = session.begintransaction (); Kriteria cr = session.createCriteria (karyawan.class); // untuk mendapatkan gaji total. cr.setProyjection (proyeksi.sum ("gaji")); Daftar TotalSalary = Cr.List (); System.out.println ("Gaji Total:" + TotalSalary.get (0)); tx.commit (); } catch (hibernateException e) {if (tx! = null) tx.rollback (); e.printstacktrace (); } akhirnya {session.close (); }}} Kompilasi dan jalankan:
Berikut adalah langkah -langkah untuk mengkompilasi dan menjalankan aplikasi di atas. Pastikan Anda telah mengatur jalur dan classpath dengan tepat sebelum menyusun dan mengeksekusi.
Hasil berikut akan diperoleh dan catatan akan dibuat di tabel karyawan.
$ java manajemen
..... berbagai pesan log akan ditampilkan di sini ......... Nama Depan: Daisy Nama Belakang: Das Gaji: 5000 nama pertama: John Nama Belakang: Paul Gaji: 5000 nama pertama: Mohd Nama Belakang: YASEE Gaji: 3000Total Coint: 4Total Gaji: 15000
Jika Anda memeriksa tabel karyawan, itu harus dicatat sebagai berikut:
mysql> pilih * dari karyawan;
+-----------------------------------+| ID | first_name | last_name | gaji |+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------