SpringBoot JPA 表关联查询实例
发布时间 - 2026-01-11 00:34: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+查询的字段。
千万不要写错了,写错的话运行都运行不起来的。所以写的时候要多看看是否符合规则。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# spring
# boot
# jpa
# 关联
# 关联查询
# 查询
# SpringBoot Data JPA 关联表查询的方法
# Spring Data JPA 实现多表关联查询的示例代码
# SpringData JPA中@OneToMany和@ManyToOne的用法详解
# 详谈jpa中表的@OneToMany等关联关系
# 就可以
# 的是
# 给大家
# 实体类
# 在后面
# 介绍一下
# 也要
# 错了
# 千万不要
# 要多
# 还想
# 可以看出
# 两张
# 来实现
# 既要
# 中就
# 写上
# 中要
# 源代码
# 大家多多
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程
nodejs redis 发布订阅机制封装实现方法及实例代码
Laravel如何生成和使用数据填充?(Seeder和Factory示例)
Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】
laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法
实现点击下箭头变上箭头来回切换的两种方法【推荐】
Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性
浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】
如何确保西部建站助手FTP传输的安全性?
Python图片处理进阶教程_Pillow滤镜与图像增强
如何选择PHP开源工具快速搭建网站?
Laravel Fortify是什么,和Jetstream有什么关系
如何快速搭建FTP站点实现文件共享?
WordPress 子目录安装中正确处理脚本路径的完整指南
Laravel如何使用Gate和Policy进行授权?(权限控制)
Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】
如何在云虚拟主机上快速搭建个人网站?
微信推文制作网站有哪些,怎么做微信推文,急?
Laravel如何实现全文搜索功能?(Scout和Algolia示例)
Laravel如何使用.env文件管理环境变量?(最佳实践)
Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南
手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?
Linux系统命令中screen命令详解
Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】
Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)
图册素材网站设计制作软件,图册的导出方式有几种?
Laravel如何处理文件下载请求?(Response示例)
深圳网站制作的公司有哪些,dido官方网站?
如何打造高效商业网站?建站目的决定转化率
怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?
音响网站制作视频教程,隆霸音响官方网站?
javascript读取文本节点方法小结
Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置
php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】
标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析
如何在橙子建站中快速调整背景颜色?
,交易猫的商品怎么发布到网站上去?
Laravel如何实现模型的全局作用域?(Global Scope示例)
ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】
JavaScript常见的五种数组去重的方式
Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】
Laravel如何使用模型观察者?(Observer代码示例)
浅析上传头像示例及其注意事项
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
潮流网站制作头像软件下载,适合母子的网名有哪些?
浅述节点的创建及常见功能的实现
太平洋网站制作公司,网络用语太平洋是什么意思?
Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】

