1. 程式人生 > 其它 >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);

}

呼叫結果


- End -
夢想是鹹魚
關注一下吧
以上為本篇文章的主要內容,希望大家多提意見,如果喜歡記得點個推薦哦 作者:夢想是鹹魚 出處:https://www.cnblogs.com/maggieq8324/ 本文版權歸作者和部落格園共有,歡迎轉載,轉載時保留原作者和文章地址即可。