JPA 存储库多对一
JPA Repository many to one
我有 Student
个实体和 Course
个实体。这是 @ManyToOne
关系,即 Student
一次只能参加一门课程,但课程可能有多名学生。
@Entity
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String studentId;
private String firstName;
private String secondName;
@ManyToOne
@JoinColumn(name = "course_id")
//@JsonIgnore
private Course course;
@Entity
public class Course {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String courseName;
@OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, mappedBy = "course", orphanRemoval = true, targetEntity = Student.class)
private List<Student> students = new ArrayList<>();
我post我的数据如下json:
{
"id": 1,
"courseName": "course134",
"students" : [
{
"id" : 1,
"studentId": "123",
"firstName": "John1",
"secondName": "Name1"
},
{
"id" : 2,
"studentId": "1234567",
"firstName": "John2",
"secondName": "Name2"
}
然后,当我获得我收到的课程时:
{
"id": 1,
"courseName": "course134",
"students": []
}
如何列出参加特定课程的学生?
我在 StudentRepository
中创建了一个查询
@Query("SELECT s from Student s where s.id = :courseName")
Optional<Student> getStudentByCourseName(String courseName);
还是不行。
这是我的存储库代码:
@Repository
public interface CourseRepository extends JpaRepository<Course, Long> {
Optional<Course> findCourseByCourseName(String courseName);
@Query("SELECT c.students FROM Course c WHERE c.courseName = :courseName")
Optional<Student> getStudentsByCourseName(String courseName);
}
这是我的服务方式
public Optional<Student> findStudentByCourse(String courseName){
return courseRepository.getStudentsByCourseName(courseName);
}
最后是我的控制器:
@GetMapping("/student/course/{courseName}")
public ResponseEntity<Student> findCoursesWithStudentId(@PathVariable String courseName) {
Optional<Student> byCourseName = studentService.findStudentByCourse(courseName);
if (byCourseName.isPresent()) {
return ResponseEntity.ok(byCourseName.get());
} else {
return ResponseEntity.notFound().build();
}
}
您应该查询课程 table,而不是学生 table。此外,查询将 return 列表,而不仅仅是一个实体,因此还要更改方法的 return 类型...
@Query("SELECT c.students FROM Course c WHERE c.courseName = :courseName")
List<Student> getStudentsByCourseName(String courseName) {}
编辑
您可以随时这样做:
- 执行简单方法:
Course findByCourseName(String courseName) {}
- 然后通过一个简单的方式获取它的 Students:
course.getStudents();
我有 Student
个实体和 Course
个实体。这是 @ManyToOne
关系,即 Student
一次只能参加一门课程,但课程可能有多名学生。
@Entity
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String studentId;
private String firstName;
private String secondName;
@ManyToOne
@JoinColumn(name = "course_id")
//@JsonIgnore
private Course course;
@Entity
public class Course {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String courseName;
@OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, mappedBy = "course", orphanRemoval = true, targetEntity = Student.class)
private List<Student> students = new ArrayList<>();
我post我的数据如下json:
{
"id": 1,
"courseName": "course134",
"students" : [
{
"id" : 1,
"studentId": "123",
"firstName": "John1",
"secondName": "Name1"
},
{
"id" : 2,
"studentId": "1234567",
"firstName": "John2",
"secondName": "Name2"
}
然后,当我获得我收到的课程时:
{
"id": 1,
"courseName": "course134",
"students": []
}
如何列出参加特定课程的学生? 我在 StudentRepository
中创建了一个查询 @Query("SELECT s from Student s where s.id = :courseName")
Optional<Student> getStudentByCourseName(String courseName);
还是不行。
这是我的存储库代码:
@Repository
public interface CourseRepository extends JpaRepository<Course, Long> {
Optional<Course> findCourseByCourseName(String courseName);
@Query("SELECT c.students FROM Course c WHERE c.courseName = :courseName")
Optional<Student> getStudentsByCourseName(String courseName);
}
这是我的服务方式
public Optional<Student> findStudentByCourse(String courseName){
return courseRepository.getStudentsByCourseName(courseName);
}
最后是我的控制器:
@GetMapping("/student/course/{courseName}")
public ResponseEntity<Student> findCoursesWithStudentId(@PathVariable String courseName) {
Optional<Student> byCourseName = studentService.findStudentByCourse(courseName);
if (byCourseName.isPresent()) {
return ResponseEntity.ok(byCourseName.get());
} else {
return ResponseEntity.notFound().build();
}
}
您应该查询课程 table,而不是学生 table。此外,查询将 return 列表,而不仅仅是一个实体,因此还要更改方法的 return 类型...
@Query("SELECT c.students FROM Course c WHERE c.courseName = :courseName")
List<Student> getStudentsByCourseName(String courseName) {}
编辑 您可以随时这样做:
- 执行简单方法:
Course findByCourseName(String courseName) {}
- 然后通过一个简单的方式获取它的 Students:
course.getStudents();