Dalam artikel di atas, kami telah menyelesaikan implementasi menu Easyui. Klik di sini untuk melihatnya. Di bagian ini, kami terutama akan menulis tentang kelas implementasi CategoryServiceImpl untuk menyelesaikan kueri cascading dari database. Secara umum, proyek dilakukan dari belakang ke depan, pertama -tama lakukan layanan (kami tidak mengekstrak DAO, dan akhirnya diekstraksi), dan kemudian melakukan lapisan atas setelah finishing.
Sebelum menulis, mari kita lihat tabel di database:
Jatuhkan database jika ada toko; /*Buat database dan atur encoding*/ create Database Shop Default Character Set UTF8; Gunakan toko; /*Hapus tabel administrator*/ tabel drop jika ada akun; /*Hapus Tabel Kategori Produk*/ Jatuhkan Tabel jika ada kategori; /*======================================================================================================================================================= ==================================================================================================================================================== ============================================================================================================================================================== ==================================================================================================================================================== Nama Login Administrator*/ Login Varchar (20),/*Nama Administrator*/ Nama Varchar (20),/*Kata Sandi Administrator*/ Pass Varchar (20)); /*================================================================================================================================ =============================================================================================================================================== =============================================================================================================================================== ============================================================================================================================================= false, /* kunci asing, administrator mana yang mengelola kategori ini* / Account_id int, kendala AID_FK Kunci asing (Account_ID) Referensi Akun (ID));
Terutama ada dua tabel, tabel kategori produk dan tabel administrator, dan tabel administrator terkait kunci asing disediakan dalam tabel kategori produk. Artinya, produk dan administrator adalah hubungan banyak-ke-satu. Sekarang kami mulai menulis informasi kategori untuk produk kueri, dan kami membutuhkan administrator cascading.
1. Menerapkan metode kueri cascading
Pertama, tentukan metode ini di antarmuka CategoryService:
CategoryService antarmuka publik memperluas BASESERVICE <Peregory> {// Informasi Kategori Kueri, Daftar Publik Administrator Cascading <Category> QueryJoINAccount (Tipe String); // permintaan dengan nama kategori} Kemudian kami mengimplementasikan metode ini di kelas implementasi CategoryServiceImpl of CategoryService:
@Service ("CategoryService") Kategori Publik CategoryServiceImpl memperluas BASESERVICEIMPL <Gategory> mengimplementasikan CategoryService {@Override List Public <Category> queryJoinAccount (tipe string) {string hql = "dari kategori C di mana c.type like: type"; return getsession (). Createqueery (HQL) .setstring ("type", "%" + type + "%"). List (); }} Di antara dua model, kami akan menetapkan tautan ke anotasi:
// @manytoOne (fetch = fetchType.eager) @joincolumn (name = "account_id") akun publik getAccount () {return this.account; } // @onetomany (cascade = cascadetype.all, fetch = fetchType.lazy, mappedby = "account") set publik <at kategori> getCategories () {return this.categories; } Lalu kami mengujinya di kelas tes:
@Runwith (springjunit4classrunner.class) @contextConfiguration (lokasi = "classpath: beans.xml") Kategori Publik CategoryServiceImpltest {@resource CategoryService CategoryService; @Test public void testQueryJoNoCount () {for (Category C: CategoryService.QueryJoNoCount ("")) {System.out.println (c); System.out.println (c.getAccount ()); }}} 2. Masalah dengan kueri cascading
Jika kita melihat output dari konsol, kita dapat melihat bahwa itu telah mengirim lebih dari satu pernyataan SQL, tetapi kita hanya memiliki permintaan sekali, jadi mengapa kita mengirim begitu banyak pernyataan? Ini adalah masalah 1+N umum. Masalah yang disebut 1+N adalah untuk mengeluarkan pernyataan pertama untuk meminta objek saat ini, dan kemudian mengeluarkan pernyataan N untuk menanyakan objek terkait, sehingga efisiensinya menjadi sangat rendah. Hanya ada dua objek di sini. Jika ada lebih banyak objek, efisiensinya akan sangat berkurang. Bagaimana kita harus menyelesaikan masalah ini?
Mungkin Anda akan berpikir bahwa jika Anda mengatur pengambilan untuk menghasilkan fetchType.lazy, Anda tidak akan memposting beberapa pernyataan, tetapi ini jelas tidak mungkin, karena setelah mengaturnya menjadi malas, kami tidak bisa mendapatkan objek akun. Solusi yang lebih baik adalah menulis pernyataan HQL sendiri dan menggunakan gabungan fetch. Untuk detailnya, lihat kelas implementasi CategoryServiceImpl yang dimodifikasi:
@Service ("CategoryService") Kelas Publik KategoriServiceImpl memperluas BASESERVICEIMPL <Gategory> mengimplementasikan CategoryService {@Override Daftar Publik <Gategory> queryJoINAccount (tipe string) {string hql = "dari kategori c kiri gabungan c.account di mana c.tye like: type"; return getsession (). Createqueery (HQL) .setstring ("type", "%" + type + "%"). List (); }} Left gabungan berarti untuk menanyakan bersama dengan akun, mengambil berarti menambahkan objek akun ke kategori, sehingga hanya satu pernyataan SQL yang akan dikirim, dan kategori yang dikembalikan juga berisi objek akun.
3. Lengkapi fungsi paging
Pagination di Hibernate sangat sederhana. Anda hanya perlu memanggil dua metode SetFirStresult dan SetMaxResults: Mari kita modifikasi antarmuka CategoryService dan kelas implementasinya CategoryServiceImpl:
// CategoryService Public Interface CategoryService memperluas BASESERVICE <Gategory> {// Informasi Kategori Permintaan, Daftar Publik Administrator Cascading <Gategory> QueryJognAccount (tipe string, halaman int, ukuran int); // and implement pagination} //CategoryServiceImpl @Service("categoryService") public class CategoryServiceImpl extends BaseServiceImpl<Category> implements CategoryService { @Override public List<Category> queryJoinAccount(String type, int page, int size) { String hql = "from Category c left join fetch c.account where c.type like :type"; return getSession (). Createqueery (HQL) .setstring ("type", "%" + type + "%") .setFirStresult ((page-1) * size) // tunjukkan .setMaxResults (ukuran) // tunjukkan beberapa .list (); }} Mari kita mengujinya di kelas tes:
@Runwith (springjunit4classrunner.class) @contextConfiguration (lokasi = "classpath: beans.xml") Kategori Publik CategoryServiceImpltest {@resource CategoryService CategoryService; @Test public void testQueryJoNoCount () {for (Category C: CategoryService.QueryJoNoCount ("", 1,2)) {// Tampilkan halaman pertama, 2 lembar data per halaman System.out.println (C + "," + c.getAccount ()); }}} Untuk tujuan ini, kami telah selesai menulis metode layanan dan menyelesaikan fungsi cascading dan fungsi paging kategori produk.
(Catatan: Pada akhirnya, saya akan memberikan pengunduhan kode sumber dari seluruh proyek! Semua orang dipersilakan untuk mengumpulkan atau berbagi)
Alamat asli: http://blog.csdn.net/eson_15/article/details/51320212
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.