Ada dua metode implementasi untuk kueri multi-tabel dalam data musim semi JPA. Yang pertama adalah menggunakan kueri kaskade hibernasi untuk mengimplementasikannya, dan yang kedua adalah membuat antarmuka yang ditetapkan hasil untuk menerima hasil setelah kueri tabel yang terhubung. Ini adalah metode kedua.
1. Pemetaan satu-ke-satu
Entity UserInfo: Pengguna.
Alamat entitas: Alamat rumah.
Di sini, asosiasi satu-ke-satu dicapai melalui metode kunci asing (satu entitas dikaitkan dengan kunci utama entitas lain melalui kunci asing).
Kelas Entitas
1. Entitas kelas userinfo.java
Paket com.johnfnash.learn.domain; impor java.io.serializable; impor javax.persistence.entity; impor javax.persistence.generatedValue; impor javax.persistence.generationType; impor javax.persistence.id; impor javax.persistence UserInfo mengimplementasikan serializable {private static final long serialversionuid = 8283950216116626180l; @ID @GeneratedValue (strategi = generationType.Identity) Private Long UserId; nama string pribadi; usia int pribadi; seks string pribadi; email string pribadi; // Asosiasi dengan alamat pribadi alamat panjang; UserInfo publik () {super (); } UserInfo publik (nama string, usia int, jenis kelamin string, email string, alamat panjang) {super (); this.name = name; this.age = usia; this.sex = seks; this.email = email; this.addressid = addressId; } // Getter, setter @Override Public String ToString () {return string.format ("userInfo [userid =%d, name =%s, usia =%s, sex =%s, email =%s]", userid, nama, usia, seks, email); }} 2. Alamat kelas entitas.java
Paket com.johnfnash.learn.domain; impor javax.persistence.entity; import javax.persistence.generatedValue; import javax.persistence.generationType; import javax.persistence.id; import javax.persistence.table;@estity@tabel = "@@@@@@@tabel ="@@@@@@tabel (name = " @GeneratedValue (Strategy = GenerationType.Identity) Private Long AddressID; Kode Area String Pribadi; negara string pribadi; provinsi string pribadi; Private String City; area string pribadi; detail string pribadi; alamat publik () {super (); } alamat publik (string AreaCode, String Country, String Province, String City, Area String, String DetailAddress) {Super (); this.areacode = AreaCode; this.country = negara; this.province = provinsi; this.city = City; this.area = area; this.detailAddress = detailAddress; } // Getter, setter @Override Public String ToString () {return "address [addressid =" + addressId + ", AreaCode =" + AreaCode + ", country =" + country + ", provinsi =" + provinsi + ", city =" + city + ", Area =" + Area + ", detailDDRESS =" + DetailAdress + " }} Lapisan dao
1. UserInforepository.java
Paket com.johnfnash.learn.repository; import java.util.list; impor org.springframework.data.jpa.repository.jparepository; impor org.spramework.data.jpa.repository.query; impor com.joaNas com.johnfnash.learn.domain.viewinfo; antarmuka publik userInforepository memperluas jParepository <userInfo, long> {@Query (value = "Pilih com.johnfnash.learner.address. findViewInfo ();} CATATAN: Kelas ViewInfo di sini digunakan untuk menerima set hasil kueri multi-meja (menggunakan konstruktor nama kelas penuh + baru)
Kodenya adalah sebagai berikut:
Paket com.johnfnash.learn.domain; impor java.io.serializable; kelas publik viewinfo mengimplementasikan serializable {private static final long serialversionuid = -6347911007178390219l; userinfo private userinfo; alamat alamat pribadi; public viewInfo () {} public viewInfo (userInfo userInfo) {alamat alamat = alamat baru (); this.userInfo = userInfo; this.address = alamat; } public viewInfo (alamat alamat) {userInfo userInfo = UserInfo baru (); this.userInfo = userInfo; this.address = alamat; } public viewInfo (userInfo userInfo, alamat alamat) {this.userInfo = userInfo; this.address = alamat; } // Getter, setter} 2. AlamateRepository.java
Paket com.johnfnash.learn.repository; import org.springframework.data.jpa.repository.jparepository; import com.johnfnash.learn.domain.address; Alamat antarmuka publik Repository memperluas jparepository <alamat, long> {} Kode uji
Paket com.johnfnash.learn; import java.util.list; impor org.junit.after; impor org.junit.before; impor org.junit.test; impor org.junit.runner.runwith; impor org.springframework.beans.factory.notation org.springframework.boot.test.context.springboottest; impor org.springframework.test.context.junit4.springrunner; import com.johnfnash.learn.domain.address; impor com.johnfnash.learn.usdomain.userin com.johnfnash.learn.domain.viewinfo; import com.johnfnash.learn.repository.addressRepository; import com.johnfnash.learn.repository.userinforepository; @runwith (springrunner.class) @springboottestpository; UserInforepository userInforepository; @Autowired private addressrepository addressRepository; @Before public void init () {alamat addr1 = alamat baru ("027", "cn", "hubei", "wuhan", "wuchang", "123 street"); Alamat addr2 = alamat baru ("023", "cn", "chongqing", "chongqing", "yubei", "123 road"); addressrepository.save (addr1); addressrepository.save (addr2); UserInfo user1 = UserInfo baru ("ZS", 21, "MALE", "[email protected]", addr1.getAddressId ()); UserInfo user2 = UserInfo baru ("ww", 25, "pria", "[email protected]", addr2.getaddressid ()); userInforepository.save (user1); userInforepository.save (user2); } @After public void deleteAll () {userInforepository.deleteAll (); addressrepository.deleteall (); } @Test public void testQuery () {list <viewinfo> viewInfos = userInforepository.findviewInfo (); untuk (viewInfo viewInfo: viewInfos) {System.out.println (viewInfo.getUserInfo ()); System.out.println (viewInfo.getAddress ()); }}}SQL terkait kueri adalah sebagai berikut:
Hibernate: Pilih userInfo0_.user_id sebagai col_0_0_, address1_.address_id sebagai col_1_0_ dari tb_user userInfo0_ gabungan tb_address address1_ di mana userinfo0_.address_id = address1_.address_idhibernate: userinfo0_.address = address1_.address_idhibernate: userinfo0_.address = address1_.address_idhibernate: userinfo0 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_ dari Tbo5_er, USERINFO0_.SEX as Sex6_4_0_ dari TBE5_REFO0_. UserInfo0_.user_id =? Hibernate: Pilih alamat0_.address_id sebagai alamat_1_3_0_, alamat0_.area as Area2_3_0_, alamat0_.area_code sebagai Area_COD3_3_0_, address0_.city as City4_3_3_0_, alamat0_.councy0_aDy0_. Detail_A6_3_0_, alamat0_.province sebagai province7_3_0_ dari TB_Address Address0_ di mana alamat0_.address_id =? Hibernate: Pilih userInfo0_.user_id as User_ID1_4_0_, USERINFO0_.Address_ID as address_2_2_4_0_, USERINFO0_.ADDRESS_ID as address_2_2_4_4_4_4 userInfo0_.email as email4_4_0_, userInfo0_.name as name5_4_0_, userInfo0_.sex as sex6_4_0_ dari tb_user userInfo0_ di mana userinfo0_.user_id =? hibernate: pilih address0_.address_id aSeArfo0_.user_id =? Hibernate: Pilih address0_.Address_ids ADVERSIVE0_.IDE0_1 Area2_3_0_, address0_.area_code as Area_COD3_3_0_, address0_.city as City4_3_0_, address0_.country as country5_3_0_, address0_.detail_address sebagai detail_a6_3_0_, alamat0_.province as province7_dress dari THER0_ADRESS dari THER0_, THREED0_, ALAMAT0_, ALAMAT0_.PROVINCE SEBAGAI PROVINCER7_DRESS7_ADRESS7_, Alamat0_.Address_id =? Hibernate: Pilih userInfo0_.user_id sebagai user_id1_4_, userInfo0_.address_id as address_2_4_, userInfo0_.age as use3_4_, userInfo0_.email as email4_4_, userinfo3_4_, nameinfo0_.email as email4_4_, userinfo3_4_, nameinfo0_. sex6_4_ dari tb_user userInfo0_hibernate: pilih address0_.address_id sebagai alamat_1_3_, alamat0_.area sebagai Area2_3_, address0_.area_code sebagai Area_Cod3_3_, address0_. alamat0_.province sebagai province7_3_ dari TB_Address Address0_
Hasil kueri adalah sebagai berikut:
UserInfo [userid = 1, name = zs, usia = 21, sex = jantan, [email protected]]
Alamat [addressid = 1, AreaCode = 027, country = CN, provinsi = hubei, kota = wuhan, area = wuchang, detailAddress = 123 street]
UserInfo [userid = 2, name = ww, usia = 25, sex = jantan, [email protected]]
Alamat [addressid = 2, AreaCode = 023, country = cn, provinsi = chongqing, kota = chongqing, area = yubei, detailAddress = 123 jalan]
2. Pemetaan banyak-ke-banyak
Penulis Entitas: Penulis.
Buku Entitas: Buku
Di sini, banyak asosiasi yang banyak dicapai melalui tabel asosiasi.
Kelas Entitas
Kelas Entitas: Author.java
Paket com.johnfnash.learn.domain; impor java.io.serializable; impor javax.persistence.entity; impor javax.persistence.generatedValue; impor javax.persistence.id; @entitypublic class public mengimplementasikan serial yang dapat di -serial {private static static static static long long long long long long long long long long long long long {private static long long long class class public @Id @GeneratedValue Private Integer ID; nama string pribadi; penulis publik () {super (); } penulis publik (nama string) {super (); this.name = name; } // getter, setter @Override public string toString () {return string.format ("penulis [id =%s, name =%s]", id, name); }} Kelas Entitas Book.java
Paket com.johnfnash.learn.domain; import java.io.serializable; impor javax.persistence.entity; impor javax.persistence.generatedValue; impor javax.persistence.id; @entitypublic Buku kelas publik mengimplementasikan serializable {private static static static long long long long long long long class class Publiced = Private static static long long long class class class publicablic -2470510857424220408l; @Id @GeneratedValue Private Integer ID; nama string pribadi; buku publik () {super (); } buku publik (nama string) {super (); this.name = name; } // getter, setter @Override public string toString () {return string.format ("book [id =%s, name =%s]", id, name); }} Entitas Kelas BookAuthor.java
Paket com.johnfnash.learn.domain; import javax.persistence.entity; import javax.persistence.id; import javax.persistence.idclass; import javax.persistence.table;@entitas@idclass (bookAuthorpk.class) @table (name = "booker@bookor"@bookauthorpk @ID Private Integer AuthorID; Public BookAuthor () {super (); } public bookAuthor (Integer BookID, Integer AuthorID) {super (); this.bookId = bookId; this.authorid = authorid; } // Getter, setter}Catatan: Di sini, gunakan anotasi @Idclass untuk menentukan kelas kunci utama Union untuk memetakan beberapa properti dari kelas entitas. Kode untuk kelas kunci utama bersama ini adalah sebagai berikut:
paket com.johnfnash.learn.domain; impor java.io.serializable; kelas publik bookauthorpk mengimplementasikan serializable {private static final long serialversionuid = -1158141803682305656l; Private Integer BookID; Private Integer Authorid; public integer getBookId () {return bookId; } public void setBookId (Integer BookID) {this.bookId = bookId; } public integer getAuthorId () {return authorId; } public void setauthorid (integer authorid) {this.authorid = authorid; }} Lapisan dao
BookRepository.java
Paket com.johnfnash.learn.repository; import java.util.list; impor org.springframework.data.jpa.repository.jparepository; impor org.spramework.data.jpa.repository.Query; impor com.joaNaMework.data.jpa.repository.Query; impor com.joaNhNAck JParepository <Book, Integer> {@Query (NativeQuery = true, value = "Select b.id, b.name, group_concat (a.name) sebagai authorname dari buku b, penulis a, book_author ba" + "di mana b.id = ba.book_id dan a.id = ba.author_id dan b. name like? findBynamecontaining (nama string);} Catatan:
1) Di sini, NativeQuery = True menentukan bahwa SQL asli digunakan untuk kueri (saya pribadi berpikir lebih baik menggunakan SQL asli untuk kueri kompleks.
2) Di sini, fungsi built-in MySQL Group_Concat digunakan untuk konversi baris-ke-kolom, dan HQL tidak dapat dikenali secara langsung. Disebabkan oleh: org.hibernate.queryException: Tidak ada tipe data untuk node: org.hibernate.hql.internal.ast.tree.methodnode kesalahan dapat terjadi
Jparepository.java
Paket com.johnfnash.learn.repository; import org.springframework.data.jpa.repository.jparepository; import com.johnfnash.learn.domain.author; antarmuka publik authorrepository memperluas jparepository <penulis, integer> {} public Authorrepository memperluas jparepository <penulis, integer> {} public Authorrepository memperluas jParepository <penulis, integer> {} BookAuthorrepository.java
package com.johnfnash.learn.repository;import org.springframework.data.jpa.repository.JpaRepository;import com.johnfnash.learn.domain.BookAuthor;public interface BookAuthorRepository extends JpaRepository<BookAuthor, Integer> {} Kode uji
Paket com.johnfnash.learn; impor static org.junit.assert.asserquals; impor java.util.list; impor org.junit.after; impor org.junit.beFore; impor org.junit.test; impor org.junit.runner.runwith dengan org.junit.test; org.junit.runner.runwith; org.springframework.beans.factory.annotation.Autowired; impor org.springframework.boot.test.context.springboottest; impor org.springframework.test.context.junit4.springrunner; impor com.johnfnash.learg.learg.learn.junhor; impor com.johnfnash.learg.learg.learn.junhor. com.johnfnash.learn.domain.book; import com.johnfnash.learn.domain.bookauthor; import com.johnfnash.learn.repository.authorrepository; impor impor; impor; com.johnfnash.learn.repository.bookRepository; @runwith (springrunner.class) @springboottestpublic Class BookRepositoryTests {@Autowired private bookRepository bookRepository; @Autowired Private Authorrepository Authorrepository; @Autowired private bookAuthorrepository bookAuthorrepository; @Before public void init () {penulis lewis = penulis baru ("lewis"); Penulis Mark = penulis baru ("Mark"); Penulis Peter = penulis baru ("Peter"); authorrepository.save (lewis); authorrepository.save (Mark); authorrepository.save (Peter); Buku Spring = Buku Baru ("Spring In Action"); Buku Springboot = Buku Baru ("Spring Boot In Action"); BookRepository.Save (Spring); BookRepository.Save (Springboot); BookAuthorrepository.Save (BookAuthor baru (spring.getid (), lewis.getid ())); BookAuthorrepository.Save (BookAuthor baru (spring.getid (), Mark.getId ())); BookAuthorrepository.Save (BookAuthor baru (springboot.getid (), mark.getId ())); BookAuthorrepository.Save (BookAuthor baru (springboot.getid (), Peter.getId ())); } @After public void deleteAll () {bookAuthorrepository.deleteAll (); BookRepository.DeleteAll (); authorrepository.deleteall (); } @Test public void findAll () {assertequals (bookRepository.findall (). Size (), 2); assertequals (authorrepository.findall (). size (), 3); Daftar <Object []> Buku = BookRepository.FindByNeNContaining ("Spring%"); untuk (objek [] buku: buku) {untuk (objek objek: buku) {system.out.print (objek + ","); } System.out.println (); }}}Setelah menjalankan metode FindAll, SQL yang relevan untuk kueri adalah sebagai berikut:
Hibernate: SELECT b.id, b.name, group_concat (a.name) sebagai authorname dari buku b, penulis a, buku_author ba di mana b.id = ba.book_id dan a.id = ba.author_id dan b.name seperti? kelompok dengan b.id, b.name
Hasil output adalah sebagai berikut:
3652, Spring in Action, Lewis, Mark,
3653, Spring Boot in Action, Mark, Peter,
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.