SpringBoot JPA 表关联查询实例
今天给大家介绍一下如何利用JPA实现表关联查询。
今天给大家举一个一对多的关联查询,并且是使用JPA原生的findBy语句实现的。
例子中总共有两个实体类,一个是Floor(商品楼层类),另一个是FloorContent(商品楼层内容表)。下面看两张表的源代码:
Floor类:
packagecms.model;
importcms.model.base.BaseDomain;
importorg.hibernate.annotations.GenericGenerator;
importjavax.persistence.*;
importjava.io.Serializable;
importjava.util.List;
/**
*CreatedbyRoneyon2016/10/10.
*楼层管理
*
*/
@Entity
@Table(indexes={@Index(name="idx_floor_user",columnList="user_id")})
publicclassFloorextendsBaseDomainimplementsSerializable{
@Id
@GenericGenerator(name="PKUUID",strategy="uuid2")
@GeneratedValue(generator="PKUUID")
@Column(length=36)
protectedStringid;
/**
*发布用户ID
*/
@Column(length=36,name="user_id")
privateStringuserId;
/**
*楼层名称
*/
privateStringname;
/**
*楼层的模板路径
*/
privateStringtemplateUrl;
/**
*类型
*1.管理端
*2.供应商
*/
privateIntegertype;
/**
*排序
*/
@Column(name="show_index",nullable=false)
privateIntegershowIndex;
/**
*是否禁用
**/
@Column(nullable=false)
privateBooleanisDisable=false;
@OneToMany(fetch=FetchType.LAZY,mappedBy="floor")
privateListfloorContents;
publicListgetFloorContents(){
returnfloorContents;
}
publicvoidsetFloorContents(ListfloorContents){
this.floorContents=floorContents;
}
publicStringgetId(){
returnid;
}
publicvoidsetId(Stringid){
this.id=id;
}
publicStringgetUserId(){
returnuserId;
}
publicvoidsetUserId(StringuserId){
this.userId=userId;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicStringgetTemplateUrl(){
returntemplateUrl;
}
publicvoidsetTemplateUrl(StringtemplateUrl){
this.templateUrl=templateUrl;
}
publicIntegergetShowIndex(){
returnshowIndex;
}
publicvoidsetShowIndex(IntegershowIndex){
this.showIndex=showIndex;
}
publicBooleangetDisable(){
returnisDisable;
}
publicvoidsetDisable(Booleandisable){
isDisable=disable;
}
@Override
publicbooleanequals(Objecto){
if(this==o)returntrue;
if(o==null||getClass()!=o.getClass())returnfalse;
Floorfloor=(Floor)o;
returnid!=null?id.equals(floor.id):floor.id==null;
}
@Override
publicinthashCode(){
returnid!=null?id.hashCode():0;
}
}
FloorContent类:
packagecms.model;
importcms.model.base.BaseDomain;
importorg.hibernate.annotations.GenericGenerator;
importjavax.persistence.*;
importjava.io.Serializable;
/**
*CreatedbyRoneyon2016/10/10.
*楼层的内容
*/
@Entity
@Table(indexes={@Index(name="idx_floor_content_user",columnList="user_id")})
publicclassFloorContentextendsBaseDomainimplementsSerializable{
@Id
@GenericGenerator(name="PKUUID",strategy="uuid2")
@GeneratedValue(generator="PKUUID")
@Column(length=36)
protectedStringid;
/**
*发布用户ID
*/
@Column(length=36,name="user_id")
privateStringuserId;
/**
*內容名稱
*/
privateStringname;
/**
*
*內容圖片
*/
@Column(length=256)
privateStringcontentImageUrl;
/**
*類型
*1.超鏈接
*2.圖片檢索
*/
privateIntegertype;
/**
*超鏈接url
*/
privateStringlinkUrl;
/**
*圖片檢索內容
*/
privateStringpicSearchContent;
/**
*排序
*/
@Column(name="show_index",nullable=false)
privateIntegershowIndex;
/**
*是否禁用
*/
@Column(nullable=false)
privateBooleanisDisable=false;
@ManyToOne
@JoinColumn(name="floor_id",foreignKey=@ForeignKey(name="fk_floor_fc"))
privateFloorfloor;
publicFloorgetFloor(){
returnfloor;
}
publicvoidsetFloor(Floorfloor){
this.floor=floor;
}
publicStringgetId(){
returnid;
}
publicvoidsetId(Stringid){
this.id=id;
}
publicStringgetUserId(){
returnuserId;
}
publicvoidsetUserId(StringuserId){
this.userId=userId;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicStringgetContentImageUrl(){
returncontentImageUrl;
}
publicvoidsetContentImageUrl(StringcontentImageUrl){
this.contentImageUrl=contentImageUrl;
}
publicIntegergetType(){
returntype;
}
publicvoidsetType(Integertype){
this.type=type;
}
publicStringgetLinkUrl(){
returnlinkUrl;
}
publicvoidsetLinkUrl(StringlinkUrl){
this.linkUrl=linkUrl;
}
publicStringgetPicSearchContent(){
returnpicSearchContent;
}
publicvoidsetPicSearchContent(StringpicSearchContent){
this.picSearchContent=picSearchContent;
}
publicIntegergetShowIndex(){
returnshowIndex;
}
publicvoidsetShowIndex(IntegershowIndex){
this.showIndex=showIndex;
}
publicBooleangetDisable(){
returnisDisable;
}
publicvoidsetDisable(Booleandisable){
isDisable=disable;
}
@Override
publicbooleanequals(Objecto){
if(this==o)returntrue;
if(o==null||getClass()!=o.getClass())returnfalse;
FloorContentthat=(FloorContent)o;
returnid!=null?id.equals(that.id):that.id==null;
}
@Override
publicinthashCode(){
returnid!=null?id.hashCode():0;
}
}
实体类已经出来了,现在具体说说怎么利用JPA中findBy来实现关联查询:
packagecms.model.repository; importcms.model.Floor; importcms.model.FloorContent; importorg.springframework.data.domain.Page; importorg.springframework.data.domain.Pageable; importorg.springframework.data.jpa.repository.JpaRepository; /** *CreatedbyRoneyon2016/10/10. *CreatedbyRoneyon2016/10/10. *楼层内容管理dao类 */ publicinterfaceFloorContentReposextendsJpaRepository{ publicPage findByFloor_IdAndIsDeleteOrderByShowIndexAsc(StringfloorId,booleanb,Pageablepageable); }
从例子中就可以看出JPA关联查询主要在“_”这个符号的使用,下面来给大家具体的介绍一下这个符号到底代表什么含义。
首先findBy是必须写的,表示使用JPA规则进行查询。
如果查询的是本张表中的内容,例如查询本张表中的name字段就可以这么写:findByName()。
如果查询的是楼层中的name字段就可以这么写:findByFloor_Name()。
如果是既要查询本张表中的name字段,也要查询楼层中的name字段,就可以这么写:findByFloor_NameAndName()。
从上面的案例就可以看出可以在findBy后面添加要关联的实体类,然后在实体类后面写上“_”,"_"符号后面是添加关联表的字段而不是本身表的字段,这点要记住。如何还想关联更多的表可以在后面添加:And+表名字+“_”+表中要查询的字段。或者只是想关联本身的查询字段可以在后面添加:And+查询的字段。
千万不要写错了,写错的话运行都运行不起来的。所以写的时候要多看看是否符合规则。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。