SpringBoot JPA 表關(guān)聯(lián)查詢實(shí)例
今天給大家介紹一下如何利用JPA實(shí)現(xiàn)表關(guān)聯(lián)查詢。
今天給大家舉一個(gè)一對(duì)多的關(guān)聯(lián)查詢,并且是使用JPA原生的findBy語(yǔ)句實(shí)現(xiàn)的。
例子中總共有兩個(gè)實(shí)體類,一個(gè)是Floor(商品樓層類),另一個(gè)是FloorContent(商品樓層內(nèi)容表)。下面看兩張表的源代碼:
Floor類:
package cms.model;
import cms.model.base.BaseDomain;
import org.hibernate.annotations.GenericGenerator;
import javax.persistence.*;
import java.io.Serializable;
import java.util.List;
/**
* Created by Roney on 2016/10/10.
* 樓層管理
*
*/
@Entity
@Table(indexes = {@Index(name = "idx_floor_user",columnList = "user_id")})
public class Floor extends BaseDomain implements Serializable {
@Id
@GenericGenerator(name = "PKUUID", strategy = "uuid2")
@GeneratedValue(generator = "PKUUID")
@Column(length = 36)
protected String id;
/**
* 發(fā)布用戶ID
*/
@Column(length = 36,name = "user_id")
private String userId;
/**
* 樓層名稱
*/
private String name;
/**
* 樓層的模板路徑
*/
private String templateUrl;
/**
* 類型
* 1.管理端
* 2.供應(yīng)商
*/
private Integer type;
/**
* 排序
*/
@Column(name = "show_index", nullable = false)
private Integer showIndex;
/**
* 是否禁用
* */
@Column(nullable = false)
private Boolean isDisable=false;
@OneToMany(fetch = FetchType.LAZY,mappedBy = "floor")
private List<FloorContent> floorContents;
public List<FloorContent> getFloorContents() {
return floorContents;
}
public void setFloorContents(List<FloorContent> floorContents) {
this.floorContents = floorContents;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTemplateUrl() {
return templateUrl;
}
public void setTemplateUrl(String templateUrl) {
this.templateUrl = templateUrl;
}
public Integer getShowIndex() {
return showIndex;
}
public void setShowIndex(Integer showIndex) {
this.showIndex = showIndex;
}
public Boolean getDisable() {
return isDisable;
}
public void setDisable(Boolean disable) {
isDisable = disable;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Floor floor = (Floor) o;
return id != null ? id.equals(floor.id) : floor.id == null;
}
@Override
public int hashCode() {
return id != null ? id.hashCode() : 0;
}
}
FloorContent類:
package cms.model;
import cms.model.base.BaseDomain;
import org.hibernate.annotations.GenericGenerator;
import javax.persistence.*;
import java.io.Serializable;
/**
* Created by Roney on 2016/10/10.
* 樓層的內(nèi)容
*/
@Entity
@Table(indexes = {@Index(name = "idx_floor_content_user", columnList = "user_id")})
public class FloorContent extends BaseDomain implements Serializable {
@Id
@GenericGenerator(name = "PKUUID", strategy = "uuid2")
@GeneratedValue(generator = "PKUUID")
@Column(length = 36)
protected String id;
/**
* 發(fā)布用戶ID
*/
@Column(length = 36, name = "user_id")
private String userId;
/**
* 內(nèi)容名稱
*/
private String name;
/**
*
* 內(nèi)容圖片
*/
@Column(length = 256)
private String contentImageUrl;
/**
* 類型
* 1.超鏈接
* 2.圖片檢索
*/
private Integer type;
/**
* 超鏈接url
*/
private String linkUrl;
/**
* 圖片檢索內(nèi)容
*/
private String picSearchContent;
/**
* 排序
*/
@Column(name = "show_index", nullable = false)
private Integer showIndex;
/**
* 是否禁用
*/
@Column(nullable = false)
private Boolean isDisable = false;
@ManyToOne
@JoinColumn(name = "floor_id",foreignKey = @ForeignKey(name = "fk_floor_fc"))
private Floor floor;
public Floor getFloor() {
return floor;
}
public void setFloor(Floor floor) {
this.floor = floor;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getContentImageUrl() {
return contentImageUrl;
}
public void setContentImageUrl(String contentImageUrl) {
this.contentImageUrl = contentImageUrl;
}
public Integer getType() {
return type;
}
public void setType(Integer type) {
this.type = type;
}
public String getLinkUrl() {
return linkUrl;
}
public void setLinkUrl(String linkUrl) {
this.linkUrl = linkUrl;
}
public String getPicSearchContent() {
return picSearchContent;
}
public void setPicSearchContent(String picSearchContent) {
this.picSearchContent = picSearchContent;
}
public Integer getShowIndex() {
return showIndex;
}
public void setShowIndex(Integer showIndex) {
this.showIndex = showIndex;
}
public Boolean getDisable() {
return isDisable;
}
public void setDisable(Boolean disable) {
isDisable = disable;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
FloorContent that = (FloorContent) o;
return id != null ? id.equals(that.id) : that.id == null;
}
@Override
public int hashCode() {
return id != null ? id.hashCode() : 0;
}
}
實(shí)體類已經(jīng)出來(lái)了,現(xiàn)在具體說(shuō)說(shuō)怎么利用JPA中findBy來(lái)實(shí)現(xiàn)關(guān)聯(lián)查詢:
package cms.model.repository;
import cms.model.Floor;
import cms.model.FloorContent;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
/**
* Created by Roney on 2016/10/10.
* Created by Roney on 2016/10/10.
* 樓層內(nèi)容管理dao類
*/
public interface FloorContentRepos extends JpaRepository<FloorContent,String>{
public Page<FloorContent> findByFloor_IdAndIsDeleteOrderByShowIndexAsc(String floorId,boolean b, Pageable pageable);
}
從例子中就可以看出JPA關(guān)聯(lián)查詢主要在“_”這個(gè)符號(hào)的使用,下面來(lái)給大家具體的介紹一下這個(gè)符號(hào)到底代表什么含義。
首先f(wàn)indBy是必須寫的,表示使用JPA規(guī)則進(jìn)行查詢。
如果查詢的是本張表中的內(nèi)容,例如查詢本張表中的name字段就可以這么寫:findByName()。
如果查詢的是樓層中的name字段就可以這么寫:findByFloor_Name()。
如果是既要查詢本張表中的name字段,也要查詢樓層中的name字段,就可以這么寫:findByFloor_NameAndName()。
從上面的案例就可以看出可以在findBy后面添加要關(guān)聯(lián)的實(shí)體類,然后在實(shí)體類后面寫上“_”,"_"符號(hào)后面是添加關(guān)聯(lián)表的字段而不是本身表的字段,這點(diǎn)要記住。如何還想關(guān)聯(lián)更多的表可以在后面添加:And+表名字+“_”+表中要查詢的字段。或者只是想關(guān)聯(lián)本身的查詢字段可以在后面添加:And+查詢的字段。
千萬(wàn)不要寫錯(cuò)了,寫錯(cuò)的話運(yùn)行都運(yùn)行不起來(lái)的。所以寫的時(shí)候要多看看是否符合規(guī)則。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot3?Web編程開發(fā)的工程搭建攔截器及測(cè)試工具示例
這篇文章主要介紹了SpringBoot3?Web編程開發(fā)的工程搭建攔截器及測(cè)試工具示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
Java通過(guò)反射機(jī)制將對(duì)象封裝成JSON和JsonArray格式
這篇文章主要介紹了Java通過(guò)反射機(jī)制將對(duì)象封裝成JSON和JsonArray格式,JAVA反射機(jī)制是在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)實(shí)體類,都能夠知道這個(gè)類的所有屬性和方法,需要的朋友可以參考下2023-10-10
Spring boot配置多數(shù)據(jù)源代碼實(shí)例
這篇文章主要介紹了Spring boot配置多數(shù)據(jù)源代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
淺談Hibernate對(duì)象狀態(tài)之間的神奇轉(zhuǎn)換
這篇文章主要介紹了淺談Hibernate對(duì)象狀態(tài)之間的神奇轉(zhuǎn)換,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
jvm細(xì)節(jié)探索之synchronized及實(shí)現(xiàn)問(wèn)題分析
這篇文章主要介紹了jvm細(xì)節(jié)探索之synchronized及實(shí)現(xiàn)問(wèn)題分析,涉及synchronized的字節(jié)碼表示,JVM中鎖的優(yōu)化,對(duì)象頭的介紹等相關(guān)內(nèi)容,具有一定借鑒價(jià)值,需要的朋友可以參考下。2017-11-11
Java安全之Filter權(quán)限繞過(guò)的實(shí)現(xiàn)
在一些需要挖掘一些無(wú)條件RCE中,大部分類似于一些系統(tǒng)大部分地方都做了權(quán)限控制的,而這時(shí)候想要利用權(quán)限繞過(guò)就顯得格外重要,本文就介紹了如何實(shí)現(xiàn),一起來(lái)了解一下2021-05-05

