JPA - JPQL完成复杂的多表查询
时间:2021-08-20
本文章向大家介绍JPA - JPQL完成复杂的多表查询,主要包括JPA - JPQL完成复杂的多表查询使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
前言
JPA中可以通过设置实体的导航属性 + JPQL完成复杂的多表查询,简化SQL的编写。
示例
建表语句
- Table
CREATE TABLE `school` (
`id` int(11) DEFAULT NULL,
`name` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
CREATE TABLE `student` (
`id` int(11) DEFAULT NULL,
`name` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
CREATE TABLE `school_student` (
`id` int(11) DEFAULT NULL,
`school_id` int(11) DEFAULT NULL,
`student_id` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
- 上述表中Studen和School呈现多对多关系
Entity实体
- School.java
@Entity
@Setter
@Getter
public class School {
@Id
private Integer id;
private String name;
/**
* 多对多关系配置
*/
@ManyToMany(fetch = FetchType.LAZY, mappedBy = "schoolList")
private List<Student> studentList;
}
- Student.java
@Entity
public class Student {
@Id
private Integer id;
private String name;
/**
* 多对多关系配置
*/
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "school_student",
joinColumns = @JoinColumn(name = "student_id"),
inverseJoinColumns = @JoinColumn(name = "school_id"))
private List<School> schoolList;
}
JPQL多表查询
- 在这里,通过Studen ID 查询出关联的 School
- 常规SQL关联查询:
select
sch.id ,
sch.name
from
school sch
inner join
school_student ss
on sch.id = ss.school_id
inner join
student stu
on ss.student_id = stu.id
where
stu.id = 1
- JPQL多表查询:
@Query("select s from School s " +
"join s.studentList ss " +
"where ss.id = :id ")
完整代码
- TestController.java
@RestController
@RequestMapping("/test")
public class TestController {
@Autowired
private StudentRepository studentRepository;
@GetMapping(value = "/test")
public List<Student> test(@RequestParam Integer id){
return studentRepository.findStudenBySchool(id);
}
}
- StudentRepository.java
@Repository
public interface StudentRepository extends JpaRepository<School, Long> {
@Query("select s from School s " +
"join s.studentList ss " +
"where ss.id = :id ")
List<Student> findStudenBySchool(Integer id);
}
调用结果
原文地址:https://www.cnblogs.com/maggieq8324/p/15166419.html
- css3 gradient 渐变
- TwentyTwenty:一个图片特效Jquery 插件
- 何为实在
- css3 动画应用 animations 和transtions transform在加上JavaScript 可以实现硬件加速动画。
- 善良比聪明更重要
- zepto 基础知识(6)
- 一行 Python 代码实现并行
- zepto 基础知识(5)
- 移动Web 开发中的 Off Canvas 导航
- Angularjs基础(八)
- 移动Web 开发中的一些前端知识收集汇总
- Angularjs基础(七)
- WordPress 中八个有用的代码片段
- 【释疑文】DeveMobile、EaseMobile 及Devework 主题的区别
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Semaphore:如何快速实现一个限流器?
- 延迟初始化Spring Bean:延迟初始化的Bean会影响依赖注入吗?
- Android 音乐APP(二)启动白屏优化、定位当前播放歌曲
- CompletableFuture:异步编程没那么难
- 你知道Oracle数据库除了SGA和PGA,还有MGA么?
- .NET Standard 类库的使用技巧
- Makefile实例:批量编译多个目标
- GitHub如何回滚代码1.git log 查看commit hash值2.执行git reset --hard xxxx3.git push -f
- java获取程序执行时间
- Redis数据增多了,是该加内存还是加实例?
- 针对mysql delete删除表数据后占用空间不变小的问题
- 报错信息:(VI_1): ip address associated with VRID 80 not present in MASTER advertt : 192.168.1.8
- 如何保证集合是线程安全的? ConcurrentHashMap如何实现高效地线程安全?
- 如果MySQL的 InnoDB 文件的损坏,该如何手动恢复?
- 如何使用慢查询快速定位执行慢的 SQL?