如何在 Spring Data JPA 中取得最後一筆記錄
1. 概述
在這個簡短的教學中,我們將探索在 Spring Data JPA 中取得最後一筆記錄的不同方法。首先,我們將了解如何使用派生查詢方法來完成此操作。然後,我們將探索如何使用@Query
註釋來實現相同的目的。
2. 設定
首先,我們建立並初始化我們要查詢的表。我們先建立一個Post
實體類別:
@Entity
public class Post {
@Id
private Long id;
private String title;
private LocalDate publicationDate;
// standard getters and setters
}
這裡, @Entity
表示被註解的類別代表資料庫中的一張表。類似地, @Id
註解定義主鍵。
為了簡單起見,我們將使用 H2 作為記憶體資料庫。首先,我們新增一個基本的 SQL 腳本來建立映射到Post
類別的post
表:
DROP TABLE IF EXISTS post;
CREATE TABLE post(
id INT PRIMARY KEY,
title VARCHAR(200),
publication_date DATE
)
接下來,讓我們在表中新增資料:
INSERT INTO post (id, title, publication_date) VALUES(1, 'Facebook post', '2020-11-10');
INSERT INTO post (id, title, publication_date) VALUES(2, 'Instagram post', '2020-12-24');
INSERT INTO post (id, title, publication_date) VALUES(3, 'Twitter post', '2023-01-10');
INSERT INTO post (id, title, publication_date) VALUES(4, 'tiktok post', '2023-03-18');
INSERT INTO post (id, title, publication_date) VALUES(5, 'Pinterest post', '2023-09-09');
正如我們所看到的,這裡的最後一筆記錄是id
為 5 的記錄。因此,為了實現取得最後一筆記錄的目標,我們將根據publication_date
反轉記錄的順序。然後,我們將使用 Spring Data JPA 方法從排序結果中取得第一筆記錄。這樣我們就可以得到表格的最後一筆記錄了。
3. 使用衍生查詢方法
Spring Data JPA 因其派生查詢方法而受到稱讚。此功能提供了一種從方法名稱產生查詢的便捷方法,而無需手動編寫 SQL 語句。
Spring Data JPA 並未提供任何直接方法來取得最後一筆記錄。另一方面,它提供了從一組記錄的開頭檢索資料的簡單方法。
例如,我們可以使用findFirst
前綴來建立取得第一筆記錄的派生查詢。那麼,讓我們看看它的實際效果:
public interface PostRepository extends JpaRepository<Post, Integer> {
Post findFirstByOrderByPublicationDateDesc();
}
方法名稱findFirstByOrderByPublicationDateDesc()
的每個部分都有其意義。動詞“find”
告訴 Spring Data JPA 產生一個選擇查詢, “First”
表示它應該從結果集中檢索第一筆記錄。
此外, “OrderByPublicationDateDesc”
表示我們希望按publicationDate
屬性對記錄進行逆序排序。
在這裡,Spring Data JPA 聰明地評估方法名稱。它首先按發布日期對帖子進行降序排序。這樣,它將最後一筆記錄放在結果的開頭。
然後,它解釋“findFirst”
以傳回排序記錄的第一個元素。結果,我們得到了表格的最後一筆記錄。
現在,讓我們新增一個測試案例來確認一切都按預期工作:
@Test
void givenPosts_whenUsingFindFirstDerivedQuery_thenReturnLastPost() {
Post post = postRepository.findFirstByOrderByPublicationDateDesc();
assertNotNull(post);
assertEquals(5, post.getId());
}
我們可以看到我們的測試成功通過。
同樣,我們可以使用findTop
關鍵字來完成相同的結果。我們可以互換使用firstFirst
或findTop
沒有任何問題:
Post findTopByOrderByPublicationDateDesc();
最後,讓我們為findTopByOrderByPublicationDateDesc()
方法建立另一個測試案例:
@Test
void givenPosts_whenUsingFindTopDerivedQuery_thenReturnLastPost() {
Post post = postRepository.findTopByOrderByPublicationDateDesc();
assertNotNull(post);
assertEquals(5, post.getId());
}
如上圖所示,測試案例成功通過。
4.使用@Query
註解
另一個解決方案是使用@Query
註解將方法綁定到檢索最後一筆記錄的查詢。預設情況下, @Query
接受 JPQL 查詢。因此,讓我們在PostRepository
中新增另一個名為findLastPost()
的方法,並使用@Query
指定來取得最後一篇文章的查詢:
@Query("SELECT p FROM Post p ORDER BY p.publicationDate DESC LIMIT 1")
Post findLastPost();
簡而言之,我們選擇了按發布日期倒序排列的貼文。然後,我們使用LIMIT 1
只檢索一篇文章。傳回的貼文表示最後一筆記錄。
像往常一樣,讓我們添加一個測試案例來測試我們的新方法:
@Test
void givenPosts_whenUsingQueryAnnotation_thenReturnLastPost() {
Post post = postRepository.findLastPost();
assertNotNull(post);
assertEquals(5, post.getId());
}
不出所料,最後一筆記錄是id
為 5 的貼文。
5. 結論
在本教程中,我們探索了使用 Spring Data JPA 檢索特定表的最後一筆記錄的不同方法。首先,我們了解如何使用派生查詢方法來實作它。然後,我們在@Query
註釋中編寫 JPQL 查詢,得到相同的結果。
與往常一樣,本文的完整程式碼可以在 GitHub 上找到。