有两个实体,我先发出来
@Entity @Table(name = “b_lesson”)
class Lesson : SupportModal() {
@ManyToOne @JoinColumn(name = “course_id”)
lateinit var course: Course
}
这个实体类表示一个课程,包含一个ManyToOne关联到另一个实体类Course。在数据库表b_lesson中有一个名为course_id的外键,用于实现关联关系。
@Entity
@Table(name = “b_course”)
class Course : SupportModal() {
/** * 资源分组 */
@JoinTable( name = “b_course_group”, joinColumns = [JoinColumn(name = “course_id”, referencedColumnName = “id”)], inverseJoinColumns = [JoinColumn(name = “group_id”, referencedColumnName = “id”)] )
@ManyToMany(targetEntity = ResourceGroup::class , fetch = FetchType.EAGER)
var groups: MutableSet? = null
}
这个实体类表示一个课程,包含一个ManyToMany关联到另一个实体类ResourceGroup。在数据库表b_course_group中有一个名为course_id的外键,用于表示关联关系。一个Course可以有多个ResourceGroup,而一个ResourceGroup也可以被多个Course所关联。
使用jpa的Specification如何实现根据Course中的groups的其中一个groupId查询Lesson
可以使用JPA的Specification来实现根据Course中的groups的其中一个groupId查询Lesson,具体步骤如下:
1.在Lesson实体类中定义一个静态方法lessonHasGroupId,返回一个Specification对象,实现查询条件。
companion object {
fun lessonHasGroupId(groupId: Long): Specification<Lesson> =
Specification{ root, query, criteriaBuilder ->
val courseJoin = root.join<Lesson, Course>("course", JoinType.INNER)
val groupJoin = courseJoin.join< Course, ResourceGroup>("groups", JoinType.INNER)
criteriaBuilder.equal(groupJoin.get<Long>("id"), groupId)
}
}
2.在Service层,调用JpaRepository的findAll方法,并传入上面定义的Specification对象即可。
val groupId = 1L //需要查询的groupId
val lessons = lessonRepository.findAll(Lesson.lessonHasGroupId(groupId))
上述代码会返回groupId等于1的所有Lesson对象。这样我们就可以根据Course中的groups的其中一个groupId来查询对应的Lesson了。