在 Spring Data JPA 的世界裡,JPQL(Java Persistence Query Language
)是一個強大的工具
它讓我們能夠用類似 SQL 的語法來查詢 Java 物件
今天,我們就來深入了解 JPQL,並看看如何在我們的專案中運用它
JPQL 是一種物件導向
的查詢語言,專為 JPA 設計,用於查詢 JPA 管理的 實體
它的語法類似 SQL,但操作的是 Java 類別和屬性,而不是資料庫的表格和欄位
大小寫敏感
參數綁定
,提高安全性和可重用性讓我們修改上個範例的 TodoRepository
,把原本用查詢方法(Query Methods)
實作的地方,改用 JPQL
來改寫
使用 @Query
註解來標示相關的 JPQL
使用 @Param
註解來將方法參數與 JPQL
查詢中的參數綁定
public interface TodoRepository extends JpaRepository<Todo, Long> {
@Query("SELECT t FROM Todo t WHERE t.title = :title")
List<Todo> findByTitle(@Param("title") String title);
@Query("SELECT t FROM Todo t WHERE t.completed = true")
List<Todo> findByCompletedTrue();
@Query("SELECT t FROM Todo t WHERE t.title LIKE %:keyword% ORDER BY t.id DESC")
List<Todo> findByTitleContainingOrderByIdDesc(@Param("keyword") String keyword);
@Query("SELECT COUNT(t) FROM Todo t WHERE t.completed = false")
long countByCompletedFalse();
}
讓我們來解說每個 JPQL 查詢
LIKE
關鍵字進行 title 模糊查詢,並按 id 降序排序結果
LOWER
因為是修改原有的查詢方法(Query Methods),所以 Controller 不用修改
一樣可以使用之前的 api-test.http
來測試
我們可以使用 @Query
註解並設定 nativeQuery = true
,就可以指定使用原生 SQL
@Query(value = "SELECT * FROM todos WHERE title = ?1", nativeQuery = true)
List<Todo> findByTitleNative(String title);
查詢方法
,可以處理更複雜的查詢邏輯查詢方法
可能更直觀;複雜查詢則考慮使用 JPQL參數綁定
來防止 SQL Injection
測試
確保 JPQL 查詢的正確性JPQL 是 Spring Data JPA 中一個強大的查詢工具,它彌補了查詢方法的一些限制,同時保持了與 Java 程式碼的一致性
通過合理使用 JPQL,我們可以編寫更靈活、更複雜的查詢,同時保持程式碼的可讀性和可維護性
然而,在使用 JPQL 時,我們也需要權衡其優缺點,並在適當的場景下選擇使用
無論是 JPQL、查詢方法還是原生 SQL,選擇正確的工具來完成任務才是最重要的
同步刊登於 Blog 「Spring Boot API 開發:從 0 到 1」Day 22 JPQL 查詢
我的粉絲專頁
圖片來源:AI 產生