在本周中,想完成一个通过标签过滤的功能,虽然现在还是没写出来,但是在这个过程中,还是加深了对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
)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。