Kata pengantar
Pengantar Dasar untuk Spring-Data-JPA: Alasan kelahiran JPA adalah untuk mengintegrasikan kerangka kerja ORM pihak ketiga dan menetapkan metode standar. Baidu Encyclopedia mengatakan bahwa JDK sedang berkembang ke arah ini untuk mencapai kesatuan ORM. Namun, itu belum sepenuhnya diimplementasikan. Dalam kerangka ORM, Hibernate adalah pasukan besar, banyak digunakan, nyaman, dan memiliki kemampuan yang kuat. Pada saat yang sama, Hibernate juga terintegrasi dengan baik dengan JPA. Kita dapat berpikir bahwa JPA adalah standar, dan pada kenyataannya, JPA hampir semua antarmuka, dan semua implementasi dilakukan oleh Hibernate. Dari perspektif makro, Hibernate beroperasi dengan sangat baik di bawah penyatuan JPA.
Baru -baru ini, saya telah menggunakan Springboot dan Spring Data JPA. Menggunakan JPA dapat membuat saya lebih nyaman untuk mengoperasikan database, tetapi saya telah menemukan banyak jebakan saat digunakan. Saya akan merekam artikel berikut. Saya tidak akan mengatakan banyak hal di bawah. Mari kita lihat perkenalan terperinci bersama -sama.
Pemandangan:
Kueri dinamis, kueri paging, permintaan tabel data yang berbeda sesuai dengan berbagai negara yang disahkan, dan menggunakan peta untuk mengonversi VO sebelum melewati objek halaman. Berbagai tempat penggunaan yang dapat diajukan mempengaruhi kebenaran data paged, jadi kami akan membahasnya.
Premis:
Objek halaman terlampir di VO, dan data pengembalian mencakup data paged
@Apimodelproperty ("Record") Private Page <ActivityRecordVo> ActivityRecordVolist; @ApimodelProperty ("Kuantitas") Private Integer NUM = 0; @ApimodelProperty ("Jumlah") Private BigDecimal TotalMoney = BigDecimal.Valueof (0);Aplikasi yang salah:
Daftar <ActivityRecordVo> ActivityRecordVolist = ArrayList baru <> (); if (receivesEndRecordRequestVo.GetSendorReceivetype () == sendorreceivetype.receive) {Daftar <CHALLINGERECORD> ChallengerecordList = ChallengerecordDao.findbyuseriddeleletype (userid, deletetype.false); if (! collections.isempty (Challengerecordlist)) {ActivityRecordVolist = Challengerecordlist.stream () .map (this :: ChallengerecordtoactivityRecordvo) .collect (collectors.tolist ()); }} lain jika (receivesEndRecordRequestVo.getSendorreceivetype () == sendorreceivetype.send) {list <activity> ActivityList = ActivityDao.findbyuseriddeleteType (userid, deletetype.false); if (! collections.isempty (ActivityList)) {ActivityRecordVolist = ActivityList.stream () .map (ini :: ActivityToactivityRecordVo) .collect (collectors.tolist ()); }}ActivityReceivesEndRecordVo.SetActivityRecordVolist (PageImpl baru <> (ActivityRecordVolist, Pagable, ActivityRecordVolist.size ()));
Analisis: Pageable yang disahkan hanya menggunakan halaman baru untuk mengonversi daftar menjadi objek halaman saat diatur ke VO. Meskipun jumlah total halaman dan jumlah total garis yang dilaporkan di front-end sudah benar, jumlah baris pada halaman pertama adalah semua, dan data tidak normal!
Metode referensi yang benar:
Gunakan spesifikasi untuk secara dinamis meminta dan memetakan objek paging yang sesuai sesuai dengan kondisi kueri (kode blok ini bervariasi sesuai dengan persyaratan). Pada saat ini, lewat yang disahkan di FindAll efektif, dan informasi paging yang benar akan ditampilkan.
Referensi Blok Kode:
XXXCommonspecutil adalah kelas alat spesifikasi yang diproklamirkan sendiri, mirip dengan metode kueri asli JPA Data Native JPA.
Halaman <ActivityRecordVo> halaman = Halaman baru <> (ActivityRecordVolist, Pageable, ActivityRecordVolist.size ()); if (receiveSendRecordRequestVO.getSendOrReceiveType() == SendOrReceiveType.RECEIVE) { Specifications<ChallengeRecord> spec = Specifications.where( challengeCommonSpecUtil.equal("userId", userId)) .and(challengeCommonSpecUtil.equal("deleteType", DeleteType.FALSE)); halaman = Challengerecorddao.findall (spec, pagable) .map (this :: challengerecordtoactivityrecordvo); } lain jika (receivesEndRecordRequestVo.getSendorreceivetype () == sendorreceivetype.send) {spesifikasi <active> spesifikasi = spesifikasi.where (ActivityCommonspecutil.equal ("UserId", UserId)) .and (ActivityCommonspecutil.equal ("deleteType", deleteType "deletetype. page = Activitydao.findall (spec, pagable) .map (this :: activitytoactivityrecordvo); }CATATAN: ActivityReceivesEndRecordVo adalah Vo yang dienkapsulasi, yang berisi objek halaman yang dikembalikan
ActivityReceivesEndRecordVo.SetActivityRecordVolist (Page);
Meringkaskan
Setelah menggunakan JPA data pegas begitu lama, saya pikir spesifikasi sangat berguna dan tidak rentan terhadap kesalahan. Ini juga gaya penyandian favorit saya. Namun, saya biasanya menggunakan metode sederhana dan kasar dari halaman baru <> () untuk meminta data dan mengaitkan terlalu banyak tabel. Saya akan kembali langsung di akhir. Tingkat yang lebih dalam perlu dibahas lagi!
Oke, di atas adalah seluruh konten artikel ini. Saya berharap konten artikel ini memiliki nilai referensi tertentu untuk studi atau pekerjaan semua orang. Jika Anda memiliki pertanyaan, Anda dapat meninggalkan pesan untuk berkomunikasi. Terima kasih atas dukungan Anda ke wulin.com.