首页 > 开发 > Java > 正文

SpringBoot JPA 表关联查询实例

2024-07-13 10:06:14
字体:
来源:转载
供稿:网友

今天给大家介绍一下如何利用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+查询的字段。

千万不要写错了,写错的话运行都运行不起来的。所以写的时候要多看看是否符合规则。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持VeVb武林网。


注:相关教程知识阅读请移步到JAVA教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表