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; publicList getFloorContents(){ returnfloorContents; } publicvoidsetFloorContents(List floorContents){ 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+查询的字段。
千万不要写错了,写错的话运行都运行不起来的。所以写的时候要多看看是否符合规则。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。