Spring Data JPA có ba cách khai báo truy vấn, chọn theo độ phức tạp:
1. Derived query — Spring sinh JPQL từ tên method. Ngắn gọn, an toàn kiểu, nhưng tên dài ra rất nhanh khi nhiều điều kiện.
java
List<Order> findByStatusAndCreatedAtAfter(OrderStatus status, Instant since);2. @Query với JPQL — viết truy vấn tay nhưng vẫn ở mức entity, độc lập với dialect DB.
java
@Query("select o from Order o where o.status = :status and o.total > :min")
List<Order> findExpensive(@Param("status") OrderStatus status, @Param("min") BigDecimal min);- **3.
- Native query** — SQL thuần, bật cờ
nativeQuery = true. - Dùng khi cần thứ JPQL không diễn tả được: window function, CTE, hint tối ưu, cú pháp riêng của DB.
java
@Query(value = "select * from orders where total > :min order by total desc limit 10", nativeQuery = true)
List<Order> findTopExpensive(@Param("min") BigDecimal min);Đánh đổi: native query mất tính di động giữa các DB và không được validate lúc khởi động như JPQL.
Quy tắc thực dụng: derived query cho truy vấn 1-2 điều kiện, @Query JPQL cho phần còn lại, native chỉ khi thật sự cần.