Spring Data JPA多表查询
多表查询在Spring Data JPA中有两种实现方式
第一种创建一个结果集接口来接收多表连查的结果
第二种利用JPA的关联映射来实现
先来熟悉一下几个注解
注解 | 意思 | 属性 |
---|---|---|
@ManyToOne | 定义了连接表之间的多对一的关系。 | targetEntity属性表示关联的实体类型,可省略,fetch属性表示加载策略,FetchType的取值范围LAZY(延迟加载)默认上EAGER,cascade属性表示级联操作,CascadeType取值范围PERSIST(级联持久化),REMOVE(级联删除),ALL(级联所以操作)…等,一般不推荐使用ALL,风险较大,cascade属性一般不在多对一的地方使用,通常在一对多地方使用 |
@JoinColumn | 指定一个实体组织或实体的集合。这是用在多对一和一对多关联。 | name属性表示外键的字段名称 |
@OneToMany | 定义了连接表之间存在一个一对多的关系。 | 具有@ManyToOne注解的属性,还有mappedby属性用来设置对象之间的关系维护方 |
这里只是列出了JPA进行多表查询的注解,如果对普通的JAP注解不了解的可以去看一下这篇相关的博客
什么是JPA、JPA的基础实战
话不多说,直接上代码,让老夫来瞎操作一波
先上两个实体类,用户类,角色类,这里不建议使用@Data的注解,不然会出现堆栈溢出的异常
大家在看实体类的时候一定要认真看哦,看清楚使用了哪些注解以及属性
用户类
import javax.persistence.*;
import java.io.Serializable;@Entity
@Table(name = "sys_user")
public class SysUser implements Serializable {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private long userId;private String userName;private String userPassword;private long userFlag;@ManyToOne(targetEntity = SysRole.class)@JoinColumn(name = "user_role_id")private SysRole sysRole;public long getUserId() {return userId;}public void setUserId(long userId) {this.userId = userId;}public SysRole getSysRole() {return sysRole;}public void setSysRole(SysRole sysRole) {this.sysRole = sysRole;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getUserPassword() {return userPassword;}public void setUserPassword(String userPassword) {this.userPassword = userPassword;}public long getUserFlag() {return userFlag;}public void setUserFlag(long userFlag) {this.userFlag = userFlag;}public SysUser(String userName, String userPassword, long userFlag, SysRole sysRole) {this.sysRole = sysRole;this.userName = userName;this.userPassword = userPassword;this.userFlag = userFlag;}public SysUser() {}
}
角色类
import javax.persistence.*;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;@Entity
@Table(name = "sys_role")
public class SysRole {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private long roleId;private String roleName;private String roleDesc;private long roleFlag;@OneToMany(targetEntity = SysUser.class, fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "sysRole")private Set<SysUser> sysUsers = new HashSet<SysUser>();public Set<SysUser> getSysUsers() {return sysUsers;}public void setSysUsers(Set<SysUser> sysUsers) {this.sysUsers = sysUsers;}public long getRoleId() {return roleId;}public void setRoleId(long roleId) {this.roleId = roleId;}public String getRoleName() {return roleName;}public void setRoleName(String roleName) {this.roleName = roleName;}public String getRoleDesc() {return roleDesc;}public void setRoleDesc(String roleDesc) {this.roleDesc = roleDesc;}public long getRoleFlag() {return roleFlag;}public void setRoleFlag(long roleFlag) {this.roleFlag = roleFlag;}public SysRole(String roleName, String roleDesc, long roleFlag) {this.roleName = roleName;this.roleDesc = roleDesc;this.roleFlag = roleFlag;}public SysRole() {}
}
创建SysRoleRepository接口和SysUserRepository接口
SysUserRepository接口
public interface SysUserRepository extends JpaRepository<SysUser,Long> {}
SysRoleRepository接口
public interface SysRoleRepository extends JpaRepository<SysRole,Long> {}
测试基本的CRUD
测试多对一查询
@AutowiredSysUserRepository sysUserRepository;@Testpublic void testFindById() {SysUser sysUser = sysUserRepository.findById(18L).get();System.out.println("userName:" + sysUser.getUserName());System.out.println("roleName:" + sysUser.getSysRole().getRoleName());}
结果
测试多对一的添加
@AutowiredSysRoleRepository sysRoleRepository;@Testpublic void testAdd() {SysRole sysRole = new SysRole("test","001",1);SysUser sysUser = new SysUser("test","1234567",1,sysRole);sysRole.getSysUsers().add(sysUser);sysRoleRepository.save(sysRole);}
结果
删除的话需要把@OneToMany注解里面的cascade属性值改成CascadeType.ALL或者是CascadeType.REMOVE即可
到这来就结束咯,快点去使用一下吧
Spring Data JPA多表查询相关推荐
- Spring Data JPA 多表关联查询的实现
Spring Data JPA 多表关联查询的实现 多表查询在spring data jpa中有两种实现方式,第一种是利用hibernate的级联查询来实现,第二种是创建一个结果集的接口来接收连表查询 ...
- Spring Data JPA多表操作(5)
Spring Data JPA多表操作(5) 数据库中多表之间的关系 多对多 一对多 一对一 一对多示例 数据库设计示例 实体示例 客户:指的是一家公司,我们记为A. 联系人:指的是A公司中的员工. ...
- spring data jpa实现分页查询功能
spring data jpa实现分页查询功能 HTML代码部分: // 收派标准信息表格 $('#grid').datagrid( {iconCls : 'icon-forward',fit : t ...
- spring data jpa 多对多查询
spring data jpa 多对多查询 以用户-角色 多读多为例: User类,用户 @Entity public class User {private String username;priv ...
- Spring Data Jpa多表联合分页查询
参考:https://blog.csdn.net/qq_36144258/article/details/80298354 近期一个项目用到Spring Data Jpa,Jpa用来做单表查询非常的简 ...
- Spring Hibernate JPA 联表查询 复杂查询
(转自:http://www.cnblogs.com/jiangxiaoyaoblog/p/5635152.html) 今天刷网,才发现: 1)如果想用hibernate注解,是不是一定会用到jpa的 ...
- spring data jpa 的 in 查询 Specification 实现
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 只是一个简单需求: 查询所有部门id 属于 idList 的数据 Page<WorkWei ...
- Spring Data JPA自定义SELECT查询语句,自定义UPDATE修改语句
查询语句: 1. 在@Query 注解里设置value ,?1.?2 分别代表第一第二个参数, nativeQuery=true 表示是否是原生SQL @Query(value = "se ...
- java data jpa_java中Spring data jpa通过Predicate查询时间段
如下,想搜索time1和time2之间的数据,但是查不到cb是重写了方法中的参数CriteriaBuilder,root是参数Rootpredicates.add(cb.between(root.ge ...
最新文章
- robot向linux发送命令,linux发送手机短信 利用fesion robot
- boost::intrusive::set用法的测试程序
- ITK:创建一个自定义颜色图
- OAuth2.0学习(1-9)新浪开放平台微博认证-web应用授权(授权码方式)
- 电脑复制粘贴_手机扫一扫,现实物体隔空复制粘贴进电脑!北大校友的AI新研究,现在变成AR酷炫应用...
- java 整型数组排序,java整型数组冒泡排序
- 一种新的8B/10B编解码硬件设计方法
- 电大计算机本科离散数学考试题,国开(中央电大)本科《离散数学(本)》网上形考(任务一至三)试题及答案...
- Improved GAN
- 解读:计数器Counter
- React+TypeScript+webpack4多入口项目搭建
- OSChina 周二乱弹 —— 这样成功要到小护士姐姐的微信
- tbSchedule 使用
- Windows10使用diskpart分区
- vmware mac os 10.11.6 安装xcode 8
- win版本openssl工具下载安装
- 片上总线Wishbone 学习(四)接口信号定义
- “无聊猿” BAYC 的内忧与外患
- Ubuntu 20.04 -中文输入法-fcitx-connection failed [ip:91.189.91.38 80]
- 快速释放磁盘空间的方法