Mari kita bicara tentang kueri kriteria, yang mudah bagi programmer AS yang tidak terlalu terbiasa dengan pernyataan SQL.
Tanpa basa -basi lagi, mari kita lihat contohnya:
Kelas entitas adalah sebagai berikut:
Pengguna kelas publik mengimplementasikan serializable {private static final long serialversionuid = 1l; ID Panjang Publik; nama string pribadi; usia int pribadi; // hilangkan metode get/atur} Kami tidak akan menulis file pemetaan, ini adalah entitas yang sangat sederhana. Jika Anda tidak memahami sepatu anak -anak, silakan merujuk ke artikel saya yang lain dalam kategori Hibernate.
Selanjutnya, mari kita lihat cara menggunakan kriteria untuk meminta:
public static void main (string [] args) {configuration cfg = new configuration (). configure (); SessionFactory sessionFactory = cfg.buildsessionFactory (); Sesi sesi = sessionfactory.opensession (); Kriteria kriteria = session.createCriteria (user.class); criteria.add (pembatasan.eq ("name", "shun")); Daftar daftar = criteria.list (); Iterator iter = list.iterator (); while (iter.hasnext ()) {user user = (user) iter.next (); System.out.println (user.getName ()+":"+user.getage ()); } session.close (); } Melihat kode, itu adalah string yang sangat sederhana.
Kita semua terbiasa dengan yang sebelumnya, dan kita melihat kode setelah membangun sesi:
Kriteria kriteria = session.createCriteria (user.class); criteria.add (pembatasan.eq ("name", "shun")); Dua kalimat kode ini adalah poin utama. Mari kita analisis apa sebenarnya artinya?
Dalam kalimat pertama, kami memperoleh objek dari kelas implementasi kriteria melalui sesi, dan dalam kalimat kedua, kami menambahkan kondisi melalui metode ADD, dan EQ mewakili kesetaraan. Hibernate3 sebelumnya diimplementasikan melalui ekspresi.eq. Setelah 3, karena kriteria ditinggalkan, kami menggunakan kelas pembatasan untuk mengimplementasikannya, yang sama dengan ekspresi. Mari kita lihat API dan temukan ekspresi yang mewarisi dari pembatasan.
Kembali ke dua kalimat kami di atas, setelah kami menyelesaikan tugas -tugas ini, Hibernate sebenarnya membantu kami membangun yang serupa
Pilih * dari pengguna where name = 'shun'
Pernyataan seperti itu. (Di sini, tabel yang sesuai dengan kelas pengguna dalam file pemetaan kami adalah tabel pengguna, dan atribut nama sesuai dengan bidang nama)
Pembatasan juga memiliki banyak metode untuk membantu kami membangun pernyataan SQL. Mudah dimengerti setelah memeriksa API.
Mari kita lihat kembali kode di atas. Jika kami menutup sesi, tetapi kami ingin terus menggunakan kriteria ini, apakah itu OK? Mari kita lihat.
Setelah kode di atas, kami melakukan traverse, menambahkan:
Daftar daftar2 = criteria.list (); Iterator iter2 = list.iterator (); while (iter.hasnext ()) {user user = (user) iter.next (); System.out.println (user.getName ()+":"+user.getage ()); } Untuk membedakan perbedaan antara daftar sebelumnya dan ITER, kami menggunakan yang lain di sini.
Jalankan dan kami mendapatkan pengecualian:
org.hibernate.SessionException: Sesi ditutup!
Melaporkan pengecualian ini berarti bahwa sesi telah ditutup. Dalam banyak kasus, kami akan melaporkan pengecualian serupa setelah menutup sesi dan kemudian melakukan operasi terkait dengan SaveorUpdate, Save, dll.
Hibernate3 memperhitungkan kebutuhan kita dan mengimplementasikan kriteria yang terpisah, yang dapat ada secara independen dari sesi.
Mari kita lihat contohnya: (entitas masih di atas)
public static void main (string [] args) {configuration cfg = new configuration (). configure (); SessionFactory sessionFactory = cfg.buildsessionFactory (); Sesi sesi = sessionfactory.opensession (); DetachedCriteria Deciteria = DetachedCriteria.forclass (user.class); deciteria.add (pembatasan.eq ("name", "shun")); Daftar Daftar = Deciteria.getExecutableCriteria (sesi) .list (); Iterator iter = list.iterator (); while (iter.hasnext ()) {user user = (user) iter.next (); System.out.println (user.getName ()+":"+user.getage ()); } session.close (); Session session2 = sessionfactory.opensession (); Daftar Daftar2 = Deciteria.GetExecutableCriteria (session2) .list (); Iterator iter2 = list2.iterator (); while (iter2.hasnext ()) {user user = (user) iter2.next (); System.out.println (user.getName ()+":"+user.getage ()); }} Kami melihat bahwa setelah sesi ditutup, kami dapat terus menggunakan DetachedCriteria dalam koneksi lain. Kita perlu mengaitkan kriteria terpisah saat ini dengan sesi tertentu melalui getExecutableCriteria (sesi sesi).
Selanjutnya, mari kita lihat kombinasi kelas Subqueries dan DetachedCriteria:
public static void main (string [] args) {configuration cfg = new configuration (). configure (); SessionFactory sessionFactory = cfg.buildsessionFactory (); Sesi sesi = sessionfactory.opensession (); DetachedCriteria Deciteria = DetachedCriteria.forclass (user.class); deciteria.setproyjection (proyeksi.avg ("usia")); Kriteria kriteria = session.createCriteria (user.class); kriteria.add (subqueries.propertygt ("usia", dekiteria)); Daftar daftar = criteria.list (); Iterator iter = list.iterator (); while (iter.hasnext ()) {user user = (user) iter.next (); System.out.println (user.getName ()+":"+user.getage ()); } session.close (); } Saya kira kalimat kode pertama yang Anda punya pertanyaan:
deciteria.setproyjection (proyeksi.avg ("usia")); Kode ini mengacu pada mendapatkan nilai rata -rata usia melalui dekiteria. Kemudian dapatkan objek dengan usia lebih besar dari nilai rata -rata di bawah ini.
Proyeksi berisi banyak metode enkapsulasi yang mengimplementasikan metode SQL. Anda dapat melihat API.
Mari kita pelajari tentang penggunaannya yang sedikit lebih maju.
Lihat saja kodenya:
kriteria.setFirStresult (10); kriteria.setMaxResults (20);
Di sini kami menetapkan catatan awal sebagai Pasal 10, dan kemudian menemukan 20 catatan dari Pasal 10. Menurut praktik ini, kami dapat mengimplementasikan fungsi paging dasar.
Tentu saja, kita perlu menyortir dalam banyak kasus, dan kriteria juga mendukungnya:
criteria.addorder (order.desc ("usia")); Di sini, kita dapat menggunakan metode Addorder secara langsung, dan memperoleh objek pesanan melalui CESOTAG.DESC, yang memerlukan parameter atribut. Bahkan, ketika kita memanggil Addorder, Hibernate akan membantu kita menghasilkan pesanan demi usia, pernyataan seperti itu.
Bagaimana kita melakukan ini saat kita perlu mengelompokkannya? Ini membutuhkan metode grouproperty dari kelas proyeksi yang kami sebutkan terakhir kali.
kriteria.
Di sini kami mengelompokkan sesuai dengan atribut usia, yang sebenarnya dikelompokkan melalui usia lapangan yang sesuai dengan usia. Hibernate akan secara otomatis mengubahnya menjadi pernyataan seperti kelompok berdasarkan usia.
Ada banyak metode praktis dalam proyeksi (perhatikan bahwa ini hanya tersedia setelah Hibernate 3).