在 JPQL 中較常的操作就是查詢(SELECT
),而比較少會直接透過 JPQL 進行 UPDATE
的操作。如果我們需要 INSERT
或 UPDATE
資料,通常會使用 Spring Data JPA 的 save
方法來儲存資料。
延續我們昨天的實作,今天我們試著將資料新增置資料庫內:
情境二、假設這學期的期中考已經結束了,老師想要把學生的成績歸檔。
假設老師是根據學號來將學生的成績歸檔,我們首先會先需要一個以學號為查詢條件查詢的 JPQL,用於取得學生資料,以確保資料庫中存在該學生的基本資料:
@Query(value = "SELECT * FROM education.dbo.student_information WHERE si_serial_number =:serialNumber", nativeQuery = true)
StudentInformation getStudentBySerialNumber(
@Param("serialNumber") String serialNumber);
nativeQuery = true
表示使用原生 SQL
假設透過上述查詢語法成功查詢到某個學生的資料,我們才能將考試成績建立至學生成績的資料表內,否則則不存入:
StudentInformation studentInformation = studentInformationRepository.getStudentBySerialNumber(serialNumber);
if(studentInformation != null){
StudentScores ss = new StudentScores();
ss.setSsSiId(studentInformation.getSiId());
ss.setSsExamId(studentScore.getExamId());
ss.setSsSubject(studentScore.getSubject());
ss.setSsScore(studentScore.getScore());
studentScoresRepository.saveAndFlush(ss);
}
在儲存階段想稍微提到一個我認為蠻重要的概念,當我們的 Repository
繼承了 JpaRepository
時,它提供了我們 sava()
和 saveAndFlush()
的方法讓我們儲存 entity。雖然開發者多數都知道有這兩種方法進行資料儲存,但我發現好像不是所有人都了解這兩個方法的差異性:
完整範例如下:Controller
@RequestMapping(value = "/setStudentScores", method = RequestMethod.GET)
public String setStudentScores(
@RequestParam(value = "serialNumber", required = true) String serialNumber,
@RequestParam(value = "examId", required = true) String examId,
@RequestParam(value = "subject", required = true) String subject,
@RequestParam(value = "score", required = true) String score) {
try {
StudentScore studentScore = new StudentScore();
studentScore.setExamId(examId);
studentScore.setSubject(subject);
studentScore.setScore(score);
int result = studentService.saveStudentScores(serialNumber, studentScore);
if (result == 0) {
return "資料儲存成功";
}
return "查無此學生資料";
} catch (Exception exception) {
return "發生錯誤,無法儲存資料";
}
Service
public int saveStudentScores(String serialNumber, StudentScore studentScore){
StudentInformation studentInformation = studentInformationRepository.getStudentBySerialNumber(serialNumber);
if(studentInformation != null){
StudentScores ss = new StudentScores();
ss.setSsSiId(studentInformation.getSiId());
ss.setSsExamId(studentScore.getExamId());
ss.setSsSubject(studentScore.getSubject());
ss.setSsScore(studentScore.getScore());
studentScoresRepository.saveAndFlush(ss);
return 0;
}
return 1;
}
Repository
@Query(value = "SELECT * FROM education.dbo.student_information WHERE si_serial_number =:serialNumber", nativeQuery = true)
StudentInformation getStudentBySerialNumber(
@Param("serialNumber") String serialNumber);
透過 Postman 發 API 查詢結果如下: