spring data jpa 在 Specification 中使用 Subquery

在本周中,想完成一个通过标签过滤的功能,虽然现在还是没写出来,但是在这个过程中,还是加深了对spring jpa的理解。

开始的时候的想法需要用到子查询,所以就查询学习了一下。

subquery

subquery 即子查询,是数据库的基本操作,下面我们以一个例子来学习:

现在我们有两张表 klass
course
他们的关系是多对多,

现在我们要通过课程名查找上课的班级(是不是感觉多此一举?说实话,我也觉得,但咱们的重点是学习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语句为

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

原文 

https://segmentfault.com/a/1190000022015035

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » spring data jpa 在 Specification 中使用 Subquery

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址