هناك طريقتان للتنفيذ للاستعلام متعدد الطاولة في بيانات الربيع JPA. الأول هو استخدام repernate cascade query لتنفيذه ، والثاني هو إنشاء واجهة مجموعة نتائج لتلقي النتائج بعد استعلام الجدول المتصل. هذه طريقة ثانية.
1
attity userinfo: المستخدم.
عنوان الكيان: عنوان المنزل.
هنا ، يتم تحقيق جمعية فردية من خلال طريقة المفاتيح الخارجية (يرتبط أحد الكيانات بالمفتاح الأساسي لكيان آخر من خلال مفتاح خارجي).
فئة الكيان
1. كيان فئة userinfo.java
package com.johnfnash.learn.domain ؛ استيراد java.io.serializable ؛ استيراد javax.persistence.entity ؛ استيراد javax.persistence فئة userInfo تنفذ serializable {private static final long serialversionuid = 8283950216116626180l ؛ idgeneratedValue (الاستراتيجية = GenerationType.Identity) خاص مستخدم طويل ؛ اسم السلسلة الخاصة ؛ عصر INT الخاص ؛ جنسية سلسلة خاصة البريد الإلكتروني الخاص بالسلسلة الخاصة ؛ // الارتباط مع العنوان Private Long OddringId ؛ userInfo () {super () ؛ } userinfo العامة (اسم السلسلة ، int age ، سلسلة الجنس ، سلسلة البريد الإلكتروني ، addressId long) {super () ؛ this.name = name ؛ this.age = العمر ؛ this.Sex = الجنس ؛ this.email = البريد الإلكتروني ؛ this.addressid = addressId ؛ } // getter ، SetterRide Public String ToString () {return string.format ("userInfo [userId = ٪ d ، name = ٪ s ، age = ٪ s ، sex = ٪ s ، email = ٪ s]" ، userD ، الاسم ، العمر ، الجنس ، البريد الإلكتروني) ؛ }} 2. العنوان فئة الكيان. جافا
package com.johnfnash.learn.domain ؛ استيراد javax.persistence.entity ؛ استيراد javax.persistence.generatedvalue ؛ import javax.persistence.generationtype ؛ import javax.persistence.id generatedValue (الاستراتيجية = GenerType.Identity) خاص طويل العنوان ؛ الرمز الخاص بالسلسلة الخاصة ؛ سلسلة سلسلة خاصة ؛ مقاطعة سلسلة خاصة ؛ سيتي سلسلة خاصة ؛ منطقة سلسلة خاصة ؛ سلسلة خاصة التفاصيل. العنوان العام () {super () ؛ } العنوان العام (String AreaCode ، String Country ، String Province ، String City ، منطقة السلسلة ، سلسلة التفاصيل) {super () ؛ this.areAcode = AreaCode ؛ this.country = البلد ؛ this.province = المقاطعة ؛ this.city = المدينة ؛ this.area = المنطقة ؛ this.detailaddress = delationaddress ؛ } // getter ، SetterRide Public String ToString () {return "العنوان [addressId =" + addressId + "، areaCode =" + areaCode + "، country =" + country + "، pressince =" + province + "، city =" + city + "، area =" + area + "، delationaddress = }} طبقة داو
1. userInforePository.java
package com.johnfnash.learn.repository ؛ import java.util.list ؛ استيراد org.springframework.data.jpa.repository.jparepository ؛ استيراد org.springframework.data.jpa.repository.query ؛ import com.johnash.learn.learn.user com.johnfnash.learn.domain.viewinfo ؛ واجهة عامة userInforePository تمتد jparepository <userInfo ، long> { @query (value = "new com.johnfnash.learn.domain.viewinfo (u ، a) from userinfo u ، head a u.addressid < FindViewInfo () ؛} ملاحظة: يتم استخدام فئة ViewInfo هنا لتلقي مجموعات نتائج استعلام متعددة الطاولة (باستخدام مُنشئ اسم فئة كامل + كامل)
الرمز كما يلي:
package com.johnfnash.learn.domain ؛ استيراد java.io.serializable ؛ الطبقة العامة عرض الأدوات التسلسلية {private static final long serialversionuid = -6347911007178390219l ؛ userinfo userinfo الخاص ؛ عنوان العنوان الخاص ؛ Public ViewInfo () {} public viewInfo (userInfo userInfo) {address = new address () ؛ this.userInfo = userInfo ؛ this.address = العنوان ؛ } public viewInfo (عنوان العنوان) {userInfo userInfo = new userInfo () ؛ this.userInfo = userInfo ؛ this.address = العنوان ؛ } public viewInfo (userInfo userInfo ، عنوان العنوان) {this.userInfo = userInfo ؛ this.address = العنوان ؛ } // getter ، setter} 2
package com.johnfnash.learn.repository ؛ استيراد org.springframework.data.jpa.repository.jparepository ؛ استيراد com.johnfnash.learn.domain.address
رمز الاختبار
package com.johnfnash.learn ؛ import java.util.list ؛ import org.junit.after ؛ import org.junit.before ؛ import org.junit org.springframework.boot.test.context.springBoottest ؛ استيراد org.springframework.test.context.junit4.springrunner ؛ import com.johnfnash.learn.domain.address ؛ import comhnfnash.learn.domain.userinfo ؛ com.johnfnash.learn.domain.viewinfo ؛ استيراد com.johnfnash.learn.repository.addressRepository userInforePository userInForePository ؛ Autowired الخاص OddringRepository addressRepository ؛ before public void init () {address addr1 = new address ("027" ، "CN" ، "Hubei" ، "Wuhan" ، "Wuchang" ، "123 Street") ؛ addr2 = عنوان جديد ("023" ، "CN" ، "Chongqing" ، "Chongqing" ، "Yubei" ، "123 Road") ؛ addressRepository.save (addr1) ؛ addressRepository.save (addr2) ؛ userInfo user1 = new userInfo ("zs" ، 21 ، "male" ، "[email protected]" ، addr1.getAddressId ()) ؛ userInfo user2 = new userInfo ("ww" ، 25 ، "male" ، "[email protected]" ، addr2.getAddressId ()) ؛ userInForeFoSitory.save (user1) ؛ userInForeFoSitory.save (user2) ؛ } apter public void deleteall () {userInforePository.deleteall () ؛ addressRepository.deleteall () ؛ } test public void testquery () {list <OweInfo> viewInfos = userInforePository.findViewInfo () ؛ لـ (viewInfo viewInfo: viewInfos) {system.out.println (viewInfo.getuserInfo ()) ؛ system.out.println (viewInfo.getAddress ()) ؛ }}}SQL المتعلق بالاستعلام هو كما يلي:
hibernate: حدد userinfo0_.user_id as col_0_0_ ، address1_.address_id as col_1_0_ من tb_user userinfo0_ cross انضم userInfo0_.address_id as address_2_4_0_ ، userInfo0_.age as Age3_4_0_ ، userInfo0_.email as email4_4_0_ ، userinfo0_.name as name5_4_0_ ، userinfo0_sex as sex6_4_0_ userInfo0_.user_id =؟ hibernate: SELECT ODDRESS0_.ADDRESS_ID AS QUOTALE_1_3_0_ ، QUOTALD0_.AREA as area2_3_0_ ، address0_.area_code as area_cod3_3_3_0_ ، address0_.city as city4_3_0_ ، addrent0_.country as country5_3_dex adgance adgress. التفاصيل _a6_3_0_ ، address0_.province as province7_3_0_ من tb_address address0_ where address0_.address_id =؟ hibernate: حدد userinfo0_.user_id as user_id1_4_0_ ، userinfo0_.address_id as add userInfo0_.email as email4_4_0_ ، userInfo0_.name as name5_4_0_ ، userInfo0_.sex as sex6_4_0_ من tb_user userinfo0_ حيث userInfo0_ area2_3_0_ ، address0_.area_code as area_cod3_3_0_ ، address0_.city as city4_3_0_ ، address0_.country as country 5_3_0_ ، address0_.detail_address as delieveed_a6_3_0_ ، address0_province as provins7_3_0_ من from tb_address address0_.address_id =؟ hibernate: حدد userInfo0_.user_id as user_id1_4_ ، userinfo0_.address_id as address_2_4_ ، userInfo0_.age as Age3_4_ ، userInfo0_.email as email4_4_ ، userInfo0_ sex6_4_ من tb_user userinfo0_hibernate: حدد address0_.address_id as address_1_3_ ، address0_.area as area2_3_ ، address0_.area_code as area_cod3_3_ ، address0_.city as city4_3_ ، address0_country as country5_3_ ، DEALLE_A6_3_ ، address0_.province AS PROCTINCE7_3_ من TB_ADDRESS ODDRESS0_
نتائج الاستعلام هي كما يلي:
userInfo [userId = 1 ، name = zs ، age = 21 ، sex = male ، [email protected]]
العنوان [addressId = 1 ، AreaCode = 027 ، Country = CN ، Province = Hubei ، City = Wuhan ، area = Wuchang ، DelationAddress = 123 Street]
userInfo [userId = 2 ، name = ww ، age = 25 ، sex = male ، [email protected]]
العنوان [addressId = 2 ، AreaCode = 023 ، Country = CN ، Province = Chongqing ، City = Chongqing ، area = yubei ، delieveDdress = 123 Road]
2. العديد من الخرائط العددية
المؤلف الكيان: المؤلف.
كتاب الكيان: كتب
هنا ، يتم تحقيق العديد من الجمعيات من خلال طاولة الجمعية.
فئة الكيان
فئة الكيان: مؤلف
package com.johnfnash.learn.domain ؛ استيراد java.io.serializable ؛ استيراد javax.persistence.entity ؛ استيراد javax.persistence.generatedvalue ؛ import javax.persistence.id ؛ entitypublic class direments serializable {private static serialversionuid = idgeneratedValue INTEGER ID ؛ اسم السلسلة الخاصة ؛ المؤلف العام () {super () ؛ } المؤلف العام (اسم السلسلة) {super () ؛ this.name = name ؛ } // getter ، setterRide public string toString () {return string.format ("efull [id = ٪ s ، name = ٪ s]" ، id ، name) ؛ }} Book.Java الكيان فئة
package com.johnfnash.learn.domain ؛ استيراد java.io.serializable ؛ استيراد javax.persistence.entity ؛ استيراد javax.persistence.generatedvalue ؛ import javax.persistence.id ؛ entitypublic class pyricments {private static serialversionuid = -2470510 idgeneratedValue INTEGER ID ؛ اسم السلسلة الخاصة ؛ الكتاب العام () {super () ؛ } الكتاب العام (اسم السلسلة) {super () ؛ this.name = name ؛ } // getter ، SetterRide Public String ToString () {return string.format ("book [id = ٪ s ، name = ٪ s]" ، id ، name) ؛ }} كيان فئة bookauthor.java
package com.johnfnash.learn.domain ؛ استيراد javax.persistence.entity ؛ استيراد javax.persistence.id ؛ استيراد javax.persistence.idclass ؛ استيراد javax.persistence.table ID INTEGER INTEGER INTERID ؛ Public Bookauthor () {super () ؛ } bookauthor العامة (integer bookid ، integer uplorid) {super () ؛ this.bookid = bookid ؛ this.authorId = uptorid ؛ } // getter ، setter}ملاحظة: هنا ، استخدم التعليق التوضيحي iDClass لتحديد فئة المفتاح الأساسي في الاتحاد لتعيين خصائص متعددة لفئة الكيان. رمز فئة المفاتيح الأساسية المشتركة هذه كما يلي:
package com.johnfnash.learn.domain ؛ استيراد java.io.serializable ؛ الطبقة العامة bookauthorpk الأدوات التسلسلية {private static final long serialversionuid = -1158141803682305656l ؛ عدد صحيح خاص bookid. عدد صحيح مؤلف. integer getBookId () {return bookid ؛ } public void setbookid (integer bookid) {this.bookid = bookId ؛ } integer getAuthorId () {return uptorid ؛ } public void setAuthorId (integer upultId) {this.authorId = upultId ؛ }} طبقة داو
bookrepository.java
package com.johnfnash.learn.repository ؛ استيراد java.util.list ؛ استيراد org.springframework.data.jpa.repository.jparepository ؛ استيراد org.springframework.data.jpa.repository.query jParePository <book ، integer> {Query (nativeQuery = true ، value = "Select B.ID ، B.Name ، Group_Concat (A.Name) as Authorname from Book B ، Author A ، Book_Author ba" + "where b.id = ba.book_id and a.id = ba.author_id and b.name؟ FindBynameContaine (اسم السلسلة) ؛} ملحوظة:
1) هنا ، NativeQuery = True يحدد أن SQL الأصلي يستخدم للاستعلام (أعتقد شخصيا أنه من الأفضل استخدام SQL الأصلي للاستعلامات المعقدة.
2) هنا ، يتم استخدام وظيفة MySQL المدمجة group_concat لتحويل من الصف إلى العمود ، ولا يمكن التعرف على HQL مباشرة. بسبب: org.hibernate.queryexception: لا يوجد نوع بيانات للعقدة: org.hibernate.hql.internal.ast.tree.methodnode قد يحدث
jparepository.java
package com.johnfnash.learn.repository ؛ استيراد org.springframework.data.jpa.repository.jparepository
bookauthorrepository.java
package com.johnfnash.learn.repository ؛ استيراد org.springframework.data.jpa.repository.jparepository
رمز الاختبار
package com.johnfnash.learn ؛ استيراد org.junit.assert.assertequals org.springframework.beans.factory.annotation. com.johnfnash.learn.domain com.johnfnash.learn.repository.bookRepository ؛@runwith (SpringRunner.Class) springboottestpublic class BookRepositoryTests {autowired private bookrepository bookrepository ؛ AUTOWIRED الخاص Authorrepository authorrepository ؛ Autowired private bookauthorrepository bookauthorrepository ؛ before public void init () {uptor lewis = new effect ("lewis") ؛ المؤلف مارك = مؤلف جديد ("مارك") ؛ المؤلف بيتر = مؤلف جديد ("بيتر") ؛ Authorrepository.save (لويس) ؛ Authorrepository.save (Mark) ؛ Authorrepository.save (بيتر) ؛ كتاب الربيع = كتاب جديد ("Spring in Action") ؛ Book SpringBoot = كتاب جديد ("SPRING BOOT in Action") ؛ bookrepository.save (الربيع) ؛ bookrepository.save (Springboot) ؛ bookauthorrepository.save (New Bookauthor (Spring.getId () ، lewis.getid ())) ؛ bookauthorrepository.save (New Bookauthor (Spring.getId () ، mark.getid ())) ؛ bookauthorrepository.save (New Bookauthor (SpringBoot.getId () ، mark.getid ())) ؛ bookauthorrepository.save (New Bookauthor (SpringBoot.getId () ، peter.getid ())) ؛ } apter public void deleteall () {bookauthorrepository.deleteall () ؛ bookrepository.deleteall () ؛ authorrepository.deleteall () ؛ } test public void bindall () {assertequals (bookrepository.findall (). size () ، 2) ؛ assertequals (authorrepository.findall (). size () ، 3) ؛ قائمة <Object []> books = bookrepository.findbynameContaine ("Spring ٪") ؛ لـ (Object [] book: books) {for (Object Object: Book) {system.out.print (object + "،") ؛ } system.out.println () ؛ }}}بعد تنفيذ طريقة Findall ، فإن SQL ذات الصلة للاستعلام هي كما يلي:
Hibernate: Select B.ID ، B.Name ، Group_Concat (A.Name) كـ AuthorName من Book B ، المؤلف A ، Book_author BA حيث b.id = ba.book_id و a.id = ba.author_id و b.name مثل؟ مجموعة من قبل B.ID ، B.Name
نتائج الإخراج هي كما يلي:
3652 ، الربيع في العمل ، لويس ، مارك ،
3653 ، حذاء الربيع في العمل ، مارك ، بيتر ،
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.