S SmartDocs
Série: Springboot java 60 lignes · Mis à jour 2026-08-14

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);
}

Articles liés

Springboot java EN Mis à jour 2026-08-14

BookstoreApiApplication.java

BookstoreApiApplication.java — java source code from the Springboot learning materials (Springboot/bookstore-api/src/main/java/com/example/bookstore/BookstoreApiApplication.java).

Lire l'article →
Springboot java EN Mis à jour 2026-08-14

DataInitializer.java

DataInitializer.java — java source code from the Springboot learning materials (Springboot/bookstore-api/src/main/java/com/example/bookstore/config/DataInitializer.java).

Lire l'article →
Springboot java EN Mis à jour 2026-08-14

SecurityConfig.java

SecurityConfig.java — java source code from the Springboot learning materials (Springboot/bookstore-api/src/main/java/com/example/bookstore/config/SecurityConfig.java).

Lire l'article →
Springboot java EN Mis à jour 2026-08-14

AuthController.java

AuthController.java — java source code from the Springboot learning materials (Springboot/bookstore-api/src/main/java/com/example/bookstore/controller/AuthController.java).

Lire l'article →
Springboot java EN Mis à jour 2026-08-14

BookController.java

BookController.java — java source code from the Springboot learning materials (Springboot/bookstore-api/src/main/java/com/example/bookstore/controller/BookController.java).

Lire l'article →
Springboot java EN Mis à jour 2026-08-14

ApiErrorResponse.java

ApiErrorResponse.java — java source code from the Springboot learning materials (Springboot/bookstore-api/src/main/java/com/example/bookstore/dto/ApiErrorResponse.java).

Lire l'article →