SpringBoot JPA 表关联查询实例
程序员文章站
2024-03-02 18:39:40
今天给大家介绍一下如何利用jpa实现表关联查询。
今天给大家举一个一对多的关联查询,并且是使用jpa原生的findby语句实现的。
例子中总共有两个实体类,一个...
今天给大家介绍一下如何利用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+查询的字段。
千万不要写错了,写错的话运行都运行不起来的。所以写的时候要多看看是否符合规则。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: php注册和登录界面的实现案例(推荐)