繁体   English   中英

Java Spring 启动 Rest:通过特定参数搜索对象

[英]Java Spring Boot Rest: Search objects by specific parameters

我有这个带有成绩和考试的学生应用程序,我需要做的是找到特定日期的所有考试和 function 列出特定考试的平均成绩。

这是学生、考试和成绩的实体类

@Entity
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Student {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String firstname;

    private String lastname;

    private String branch;

    private int year;

    private String studentsIndex;
}

@Entity
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Exam {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    private String code;

    private LocalDate date;

    private String time;

    private String classroom;
}

@Entity
@NoArgsConstructor
@AllArgsConstructor
@Data
public class Grade {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    @ManyToOne
    private Exam exam;

    @ManyToOne
    private Student student;

    @Column(name = "Grade")
    private int grade;

}

我有所有这些的存储库,但我没有向它们添加任何其他方法。 另外,我有查找所有、按 id 查找、按 id 删除等的服务...

所以我的问题是我需要如何以及需要做什么才能获得特定日期的所有考试和特定考试的平均成绩,我需要向存储库和服务添加什么,以及如何在Controller class?

顺便说一句,我正在通过 DTO object 保存成绩,其中包含一个考试 ID,还有一个用于学生和成绩的 ID。

首先,我目前无法测试代码。 出于性能原因,我会在数据库中或通过 JPA 进行选择和聚合。 顺便说一句,我假设您正在使用 Spring 数据 JPA ...

第一种方法是将单向 JPA 映射转换为双向映射。 为此,使用@OneToManyExam class 中创建关联。

@AllArgsConstructor
@NoArgsConstructor
@Data
public class Exam {

    // Rest of your class...

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "exam")
    private List<Grade> grades;
}

接下来,您必须为您的ExamRepository编写自定义查询。 为此,您应该创建投影。

public interface IExamGradeAverage {
    Long getExamId();
    Double getGradeAverage();
}

此投影用作自定义查询的返回类型。

@Repository
public interface ExamRepository extends JpaRepository<Exam, Long> {

    @Query("SELECT e.id AS examId, AVG(g.grade) AS gradeAverage FROM Exam e JOIN e.grades g WHERE e.date = ?1")
    List<IExamGradeAverage> getAverageGradeOfExamByDate(LocalDate date);
}

之后,理论上可以创建一个 rest 端点,该端点使用 JPA 存储库实现来获取聚合。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM