Spring Data JPA 的自定義查詢方法是一個強大的功能,它允許開發者透過方法名稱來定義查詢邏輯
無需手動編寫 SQL 或 JPQL 查詢語句
這種方式不僅簡化了開發過程,還提高了代碼的可讀性和維護性
findBy
、getBy
、queryBy
、countBy
、deleteBy
等And
和 Or
連接多個條件GreaterThan
、LessThan
、Between
、Like
、In
等OrderBy
來指定排序讓我們修改之前的 TodoRepository
,增加一些自定義查詢方法
public interface TodoRepository extends JpaRepository<Todo, Long> {
// 根據標題查找待辦事項
List<Todo> findByTitle(String title);
// 查找所有已完成的待辦事項
List<Todo> findByCompletedTrue();
// 根據標題模糊查詢,並按 ID 降序排序
List<Todo> findByTitleContainingOrderByIdDesc(String keyword);
// 計算未完成的待辦事項數量
long countByCompletedFalse();
}
讓我們在 TodoController
中使用這些新方法
@RestController
@RequestMapping("/api/todos")
public class TodoController {
// 為了方便,在這裡只展示了修改後,所增加的 DB 操作相關程式碼
@GetMapping("/search")
public ResponseEntity<MyApiResponse<List<Todo>>> searchTodos(@RequestParam String keyword) {
List<Todo> todos = todoRepository.findByTitleContainingOrderByIdDesc(keyword);
return ResponseEntity.ok(new MyApiResponse<>(true, todos, null));
}
@GetMapping("/completed")
public ResponseEntity<MyApiResponse<List<Todo>>> getCompletedTodos() {
List<Todo> completedTodos = todoRepository.findByCompletedTrue();
return ResponseEntity.ok(new MyApiResponse<>(true, completedTodos, null));
}
@GetMapping("/count-incomplete")
public ResponseEntity<MyApiResponse<Long>> getIncompleteCount() {
long count = todoRepository.countByCompletedFalse();
return ResponseEntity.ok(new MyApiResponse<>(true, count, null));
}
}
可以使用之前的 api-test.http
來測試
可以看到相關的測試結果
@Query
註解自定義查詢方法是 Spring Data JPA 的一個強大特性,能夠大大提高開發效率和程式碼品質
然而,開發者應該權衡其利弊,確保在簡便性和效能之間找到適當的平衡
對於簡單到中等複雜度的查詢,自定義查詢方法是一個極好的選擇
而對於更複雜的查詢邏輯,可能需要考慮使用 @Query
註解或甚至是 原生 SQL 查詢
同步刊登於 Blog 「Spring Boot API 開發:從 0 到 1」Day 21 自定義查詢方法
我的粉絲專頁
圖片來源:AI 產生