BookRepository.java
Springboot/bookstore-api/src/main/java/com/example/bookstore/repository/BookRepository.java
package com.example.bookstore.repository;
import com.example.bookstore.entity.Book;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import java.util.List;
/**
* 書籍 Repository(資料存取層 / DAO)。
*
* 【Spring Data JPA 的魔法】
* 只要「繼承 JpaRepository 介面」,完全不用寫實作類別,
* Spring 會在啟動時自動產生實作,並內建以下常用方法:
*
* findAll() 查詢全部 → SELECT * FROM books
* findAll(Pageable) 分頁查詢 → SELECT ... LIMIT ?, ?
* findById(id) 依主鍵查詢 → SELECT ... WHERE id = ?
* save(entity) 新增或更新 → INSERT 或 UPDATE(有 id 就更新)
* deleteById(id) 依主鍵刪除 → DELETE ... WHERE id = ?
* count() 計算筆數 → SELECT COUNT(*)
* existsById(id) 是否存在 → SELECT COUNT(*) ... WHERE id = ?
*
* 泛型參數:JpaRepository<Entity 類別, 主鍵型別>
*/
public interface BookRepository extends JpaRepository<Book, Long> {
/**
* 【衍生查詢 Derived Query】
* Spring Data JPA 會解析「方法名稱」自動產生查詢:
* existsByIsbn → SELECT COUNT(*) > 0 FROM books WHERE isbn = ?
* 用於新增書籍時檢查 ISBN 是否已存在。
*/
boolean existsByIsbn(String isbn);
/**
* 檢查「其他書籍」是否已使用某 ISBN。
* 更新書籍時要排除自己,否則自己的 ISBN 也會被判定為重複。
* 產生的查詢條件:WHERE isbn = ? AND id <> ?
*/
boolean existsByIsbnAndIdNot(String isbn, Long id);
/**
* 【JPQL 自訂查詢】
* 當方法名稱不足以表達複雜條件時,可用 @Query 撰寫 JPQL。
*
* 注意:JPQL 查詢的對象是「Entity 與其屬性」(Book、b.title),
* 而不是資料表與欄位名稱!Hibernate 會自動把它轉成對應的 SQL。
*
* CONCAT('%', :keyword, '%') 實現「模糊查詢」:
* 只要書名或作者包含關鍵字就會被查出來。
*/
@Query("""
SELECT b FROM Book b
WHERE b.title LIKE CONCAT('%', :keyword, '%')
OR b.author LIKE CONCAT('%', :keyword, '%')
""")
List<Book> searchByKeyword(@Param("keyword") String keyword);
}
相關文章
BookstoreApiApplication.java
BookstoreApiApplication.java — java source code from the Springboot learning materials (Springboot/bookstore-api/src/main/java/com/example/bookstore/BookstoreApiApplication.java).
閱讀文章 →DataInitializer.java
DataInitializer.java — java source code from the Springboot learning materials (Springboot/bookstore-api/src/main/java/com/example/bookstore/config/DataInitializer.java).
閱讀文章 →SecurityConfig.java
SecurityConfig.java — java source code from the Springboot learning materials (Springboot/bookstore-api/src/main/java/com/example/bookstore/config/SecurityConfig.java).
閱讀文章 →AuthController.java
AuthController.java — java source code from the Springboot learning materials (Springboot/bookstore-api/src/main/java/com/example/bookstore/controller/AuthController.java).
閱讀文章 →BookController.java
BookController.java — java source code from the Springboot learning materials (Springboot/bookstore-api/src/main/java/com/example/bookstore/controller/BookController.java).
閱讀文章 →ApiErrorResponse.java
ApiErrorResponse.java — java source code from the Springboot learning materials (Springboot/bookstore-api/src/main/java/com/example/bookstore/dto/ApiErrorResponse.java).
閱讀文章 →