Spring data jpa SpecificationでSubqueryを使用


今週中に、タグでフィルタリングする機能を完成させたいのですが、今はまだ書いていませんが、その過程でspring jpaに対する理解が深まりました.
最初はサブクエリが必要だったので,クエリを学習した.
subquery
subqueryはサブクエリであり、データベースの基本的な操作です.次の例で学習します.
今私达は2枚の表がありますklasscourse彼らの関系は多対多で、今私达は课程名を通じて授业のクラスを探します(感じが多いのではありませんか?正直に言って、私も感じて、しかし私达の重点はsubqueryの使い方を学ぶことです)
            //       
 public List getAll(String courseName) {
        return this.klassRepository.findAll((Specification) (root, query, builder) -> {
            
            //         
            Subquery courseSubquery = query.subquery(Klass.class);
            //        select * form ...   form...
            Root courseRoot = query.from(Course.class);
            //      
            Join klassJoin = root.join("klasses");

            // select     ,where     
            courseSubquery.select(klassJoin)
            .where(builder.equal(courseRoot.get("name"),  courseName));
            
            return builder.in(root).value(courseSubquery);
        });
    }

対応するsql文は
            
              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 Specification