Ada sintaks kueri HQL di Hibernate. Tapi yang lebih kami kenal adalah menghitung pernyataan SQL. Jadi bagaimana kita harus membuat dukungan hibernasi SQL? Kami tidak perlu mempertimbangkan ini, tim Hibernate telah melakukannya.
Jangan bicara omong kosong, ambil contoh saja.
Pilih * dari T_USER USR
Di atas adalah pernyataan SQL, dan itu omong kosong, yang diketahui semua orang. Apa yang harus kita lakukan jika Hibernate ingin menjalankan pernyataan ini? Lihat kodenya:
Kueri kueri = session.createSqlQuery ("SELECT * DARI T_USER USR"); Itu saja, semua orang harus tahu apa yang tersisa, dan apa yang terjadi adalah pertanyaan normal.
Lalu apa yang dikembalikan setelah kueri?
while (iter.hasnext ()) {objek [] objs = (objek []) iter.next (); untuk (int i = 0; i <objs.length; i ++) {System.out.print (objs [i]); } System.out.println (); } Setiap hasil yang dikembalikan adalah array objek [].
Pada saat ini, seseorang keluar dan mengatakan itu berorientasi objek. Ya, ini berorientasi objek, sayangnya, tidak ada jalannya.
Mari kita terus menonton:
Pilih {usr.*} dari t_user usr Melihat ini, saya kira beberapa sepatu anak -anak mulai bergerak. Apa kawat gigi?
Jangan khawatir, luangkan waktu Anda. Mari kita lanjutkan membaca kode terlebih dahulu.
Salinan kode adalah sebagai berikut:
Kueri kueri = session.createSqlQuery ("Pilih {usr.*} Dari t_user usr"). Addentity (tuser.class);
addentitysqlquery addentity (string tableaas, class entityType) mendeklarasikan entitas "root": tableaas - tabel sql aliasentityType - jenis java entitas untuk ditambahkan sebagai root
Itu sama seperti itu, sedikit menyedot. Anda hanya bisa menggunakannya sendiri.
Parameter pertama mengacu pada alias tabel. Sama seperti pernyataan di atas, alias tabel kami adalah USR, jadi parameter pertama adalah USR, dan yang kedua mengacu pada kelas mana hasil kueri perlu dipetakan. Di sini, karena kami memetakan ke tabel T_USER melalui Tuser dalam file pemetaan, kami tentu saja Tuser di sini. Kemudian setelah memeriksa, ada pernyataan SQL, dan hasilnya adalah tipe tuser.
Hasil yang kami temukan adalah:
org.hibernate.tutorial.domain6.tuser@198cb3d
Tentu saja, milikmu pasti berbeda dari milikku. Jangan pindahkan ayam.
Mungkin kita tidak perlu mencari tahu semuanya, saat ini, yang kita butuhkan hanyalah mengatur alias:
Pilih u.id as {usr.id}, u.name as {usr.name}, u.age as {usr.age} dari t_user u Kami melihat bahwa kami menggunakan untuk menentukan alias untuk lapangan, dan hal yang sama berlaku dalam program:
Salinan kode adalah sebagai berikut:
Kueri kueri = session.createSqlQuery ("Pilih u.id sebagai {usr.id}, u.name as {usr.name}, u.age as {usr.age} dari t_user u"). Addentity ("usr", tuser.class);
<sql-query name = "querytuser"> <return alias = "usr" entity-name = "org.hibernate.tutorial.domain6.tuser" /> pilih {usr.*} dari t_user usr di mana nama =: name < /sql-query> Perhatikan bahwa nama entitas di sini perlu ditulis dengan nama paket lengkap, jika tidak kesalahan akan dilaporkan. Di sini kita memiliki pengembalian subtitle, yang menentukan alias dan nama kelas tabel, sehingga kita tidak perlu addentitas saat runtime.
Lihat kodenya:
Kueri kueri = session.getNamedQuery ("querytuser"); query.setParameter ("name", "shun"); Daftar daftar = query.list (); Iterator iter = list.iterator ();
Kami baik -baik saja seperti ini. Perhatikan bahwa kami belum menambahkan addentity, terutama karena konfigurasi dalam file konfigurasi.
Perhatikan bahwa jika dikonfigurasi dalam file konfigurasi, Anda harus memiliki subtag pengembalian untuk menentukan alias tabel dan nama kelas. Ini terutama menghindari penilaian berulang saat membaca pernyataan.
Setelah membicarakannya begitu lama, kami telah berbicara tentang tabel dengan alias. Jadi apa yang harus kita lakukan jika tabel kita tidak memiliki alias tetapi kita ingin merangkum hasilnya?
Pilih * dari T_USER USR
Ini sangat sederhana. Cukup panggil Addentity's Overloaded Method Addentity (kelas CLAZZ) dan Anda hanya perlu memberikan nama kelas, tanpa alias tabel.
Tentu saja, Hibernate juga mendukung prosedur yang tersimpan. Anda hanya perlu mengatur properti SQL-Query yang dapat dipanggil ke True dalam file konfigurasi untuk menunjukkan bahwa prosedur tersimpan yang saat ini dipanggil. Karena saya tidak memiliki banyak kontak dengan prosedur tersimpan, saya akan mempelajarinya lebih banyak di masa depan dan kemudian mempelajarinya dengan Anda.
Ketika kami menyebut metode yang sesuai dari operasi data seperti session.save, itu akan dikonversi menjadi pernyataan SQL bawaan Hibernate, tetapi bagaimana jika kita ingin mengontrol format pernyataan SQL sendiri?
Hibernate sebenarnya memikirkannya juga.
Kami langsung menambahkannya ke file pemetaan:
<sql-insert> masukkan ke t_user (nama, usia) nilai (?,?) </sql-insert> <sql-update> Perbarui pengguna set user_name =?, usia =? Dimana user_id =? </sql-update>
Perhatikan bahwa ini perlu ditambahkan dalam tag kelas sebagai subtitle. Kita semua adalah huruf kapital di sini, untuk membedakannya dari pernyataan default Hibernate, dan tidak memiliki makna lain.
Mari kita lihat panggilan pertama untuk memasukkan:
Pengguna pengguna = pengguna baru (); user.setname ("shun123123"); user.setage (23); Ketika kami menelepon Save, pernyataan Hibernate adalah:
Hibernate:
Sisipkan ke nilai pengguna (user_name, usia) (?,?)
Ini memanggil pernyataan dalam tag SQL-insert yang kami konfigurasi, mari kita lihat panggilan untuk memperbarui:
Pengguna pengguna = (user) session.get (user.class, new long (29)); user.setname ("shun123123"); user.setage (23); session.save (pengguna); Kami menelepon Simpan, secara otomatis akan memanggil pembaruan, dan pernyataan saat ini adalah:
Hibernate:
Perbarui Pengguna Set User_Name =?, Usia =? Dimana user_id =?Kami melihat bahwa pernyataan output dikapitalisasi, yang berarti bahwa pernyataan yang kami konfigurasi dipanggil.