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

相关文章
相关标签/搜索