SpringBoot JPA 表關聯查詢

林老師帶你學程式設計發表於2016-11-03

今天給大家介紹一下如何利用JPA實現表關聯查詢。

今天給大家舉一個一對多的關聯查詢,並且是使用JPA原生的findBy語句實現的。

想學習分散式、微服務、JVM、多執行緒、架構、java、python的童鞋,千萬不要掃碼,否則後果自負~

例子中總共有兩個實體類,一個是Floor(商品樓層類),另一個是FloorContent(商品樓層內容表)。下面看兩張表的原始碼:

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;

    /**
     * 釋出使用者ID
     */
    @Column(length = 36,name = "user_id")
    private String userId;

    /**
     * 樓層名稱
     */
    private String name;

    /**
     * 樓層的模板路徑
     */
    private String templateUrl;

    /**
     * 型別
     * 1.管理端
     * 2.供應商
     */
    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.
 * 樓層的內容
 */

@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;

    /**
     * 釋出使用者ID
     */
    @Column(length = 36, name = "user_id")
    private String userId;

    /**
     * 內容名稱
     */
    private String name;

    /**
     *
     * 內容圖片
     */
    @Column(length = 256)
    private String contentImageUrl;

    /**
     * 型別
     * 1.超連結
     * 2.圖片檢索
     */
    private Integer type;

    /**
     * 超連結url
     */
    private  String  linkUrl;

    /**
     * 圖片檢索內容
     */
    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;
    }
}

實體類已經出來了,現在具體說說怎麼利用JPA中findBy來實現關聯查詢:

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.
 * 樓層內容管理dao類
 */
public interface FloorContentRepos extends JpaRepository<FloorContent,String>{
    public Page<FloorContent> findByFloor_IdAndIsDeleteOrderByShowIndexAsc(String floorId,boolean b, Pageable pageable);
}

從例子中就可以看出JPA關聯查詢主要在“_”這個符號的使用,下面來給大傢俱體的介紹一下這個符號到底代表什麼含義。

首先findBy是必須寫的,表示使用JPA規則進行查詢。

如果查詢的是本張表中的內容,例如查詢本張表中的name欄位就可以這麼寫:findByName()。

如果查詢的是樓層中的name欄位就可以這麼寫:findByFloor_Name()。

如果是既要查詢本張表中的name欄位,也要查詢樓層中的name欄位,就可以這麼寫:findByFloor_NameAndName()。

從上面的案例就可以看出可以在findBy後面新增要關聯的實體類,然後在實體類後面寫上“_”,"_"符號後面是新增關聯表的欄位而不是本身表的欄位,這點要記住。如何還想關聯更多的表可以在後面新增:And+表名字+“_”+表中要查詢的欄位。或者只是想關聯本身的查詢欄位可以在後面新增:And+查詢的欄位。
千萬不要寫錯了,寫錯的話執行都執行不起來的。所以寫的時候要多看看是否符合規則。

如果大家對文章有什麼問題或者疑意之類的,可以加我訂閱號在上面留言,訂閱號上面我會定期更新最新部落格。如果嫌麻煩可以直接加我wechat:lzqcode


 

相關文章