spring data jpa 在 Specification 中使用 Subquery

在本週中,想完成一個經過標籤過濾的功能,雖然如今仍是沒寫出來,可是在這個過程當中,仍是加深了對spring jpa的理解。spring

開始的時候的想法須要用到子查詢,因此就查詢學習了一下。sql

subquery

subquery 即子查詢,是數據庫的基本操做,下面咱們以一個例子來學習:數據庫

如今咱們有兩張表klasscourse他們的關係是多對多,
如今咱們要經過課程名查找上課的班級(是否是感受畫蛇添足?說實話,我也以爲,但我們的重點是學習subquery的用法)學習

// 查詢的課程名
 public List<Klass> getAll(String courseName) {
        return this.klassRepository.findAll((Specification<Klass>) (root, query, builder) -> {
            
            // 查詢的結果的類型
            Subquery<Klass> courseSubquery = query.subquery(Klass.class);
            // 從那裏查詢  select * form ... 中的form...
            Root<Course> courseRoot = query.from(Course.class);
            // 鏈接兩個表
            Join<Course, Klass> klassJoin = root.join("klasses");

            // select 查詢結果,where即查詢條件
            courseSubquery.select(klassJoin)
            .where(builder.equal(courseRoot.get("name"),  courseName));
            
            return builder.in(root).value(courseSubquery);
        });
    }

對應的sql語句爲ui

SELECT klass
              FROM Klass klass 
              WHERE klass
              IN (
                  SELECT klassJoin
                  FROM Course course JOIN course.klasses klassJoin
                  WHERE couser.name = :courseName
              )

參考文章

spring-data subquery within a Specificationthis

相關文章
相關標籤/搜索