SpringBoot JPA 表关联查询

来源:互联网 发布:好易网络电视下載 编辑:程序博客网 时间:2024/05/22 02:18

今天给大家介绍一下如何利用JPA实现表关联查询。

今天给大家举一个一对多的关联查询,并且是使用JPA原生的findBy语句实现的。
例子中总共有两个实体类,一个是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+查询的字段。
千万不要写错了,写错的话运行都运行不起来的。所以写的时候要多看看是否符合规则。
如果大家想要源代码或者对博客有啥异议都可以加我QQ:208017534  欢迎打扰哦!!!


1 0
原创粉丝点击