JPA - JPQL完成複雜的多表查詢
阿新 • • 發佈:2021-08-20
目錄
- End -
﹀
﹀
﹀
夢想是鹹魚
關注一下吧
以上為本篇文章的主要內容,希望大家多提意見,如果喜歡記得點個推薦哦
作者:夢想是鹹魚
出處:https://www.cnblogs.com/maggieq8324/
本文版權歸作者和部落格園共有,歡迎轉載,轉載時保留原作者和文章地址即可。
前言
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);
}