diff --git a/book-rent/src/main/java/com/example/demo/controller/BookController.java b/book-rent/src/main/java/com/example/demo/controller/BookController.java index 8fa56a3..3834e48 100644 --- a/book-rent/src/main/java/com/example/demo/controller/BookController.java +++ b/book-rent/src/main/java/com/example/demo/controller/BookController.java @@ -1,39 +1,90 @@ package com.example.demo.controller; + + +import java.util.List; +import java.util.stream.IntStream; - - - - - +import org.springframework.data.domain.Page; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; +import com.example.demo.entity.BookCollection; import com.example.demo.service.BookService; - - + + /** BOOK-01:書籍検索(bookList.html) */ @Controller public class BookController { private final BookService bookService; - + public BookController(BookService bookService) { this.bookService = bookService; } - + + /** メニューの「書籍一覧」=条件なし(全件)、検索ボタン=条件付きで同じURLを使う */ @GetMapping("/books") public String list(@RequestParam(defaultValue = "") String nmBook, @RequestParam(defaultValue = "") String publisher, @RequestParam(defaultValue = "") String note, + @RequestParam(defaultValue = "0") int page, + @RequestParam(defaultValue = "10") int size, Model model) { - model.addAttribute("books", bookService.searchLendable(nmBook, publisher, note)); + + Page bookPage = + bookService.searchLendable(nmBook, publisher, note, page, size); + List pageNumbers = + IntStream.range(0, bookPage.getTotalPages()).boxed().toList(); + + model.addAttribute("books", bookPage); + model.addAttribute("bookPage", bookPage); + model.addAttribute("pageNumbers", pageNumbers); // 検索条件を保持 model.addAttribute("nmBook", nmBook); model.addAttribute("publisher", publisher); model.addAttribute("note", note); return "bookList"; } - + } +//package com.example.demo.controller; +// +// +// +// +// +// +//import org.springframework.stereotype.Controller; +//import org.springframework.ui.Model; +//import org.springframework.web.bind.annotation.GetMapping; +//import org.springframework.web.bind.annotation.RequestParam; +// +//import com.example.demo.service.BookService; +// +// +///** BOOK-01:書籍検索(bookList.html) */ +//@Controller +//public class BookController { +// private final BookService bookService; +// +// public BookController(BookService bookService) { +// this.bookService = bookService; +// } +// +// /** メニューの「書籍一覧」=条件なし(全件)、検索ボタン=条件付きで同じURLを使う */ +// @GetMapping("/books") +// public String list(@RequestParam(defaultValue = "") String nmBook, +// @RequestParam(defaultValue = "") String publisher, +// @RequestParam(defaultValue = "") String note, +// Model model) { +// model.addAttribute("books", bookService.searchLendable(nmBook, publisher, note)); +// // 検索条件を保持 +// model.addAttribute("nmBook", nmBook); +// model.addAttribute("publisher", publisher); +// model.addAttribute("note", note); +// return "bookList"; +// } +// +//} diff --git a/book-rent/src/main/java/com/example/demo/repository/BookCollectionRepository.java b/book-rent/src/main/java/com/example/demo/repository/BookCollectionRepository.java index 99f7949..0eca535 100644 --- a/book-rent/src/main/java/com/example/demo/repository/BookCollectionRepository.java +++ b/book-rent/src/main/java/com/example/demo/repository/BookCollectionRepository.java @@ -1,17 +1,18 @@ package com.example.demo.repository; - + import java.time.LocalDateTime; -import java.util.List; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import com.example.demo.entity.BookCollection; - + public interface BookCollectionRepository extends JpaRepository { - + /** * 貸出可の蔵書を部分一致(AND)で検索する。 * 空文字の条件は「指定なし」。LIKE の特殊文字は呼び出し側で '!' を使ってエスケープ済み。 @@ -22,11 +23,13 @@ public interface BookCollectionRepository extends JpaRepository search(@Param("lending") String lending, - @Param("nm") String nm, - @Param("publisher") String publisher, - @Param("note") String note); - + Page search( + @Param("lending") String lending, + @Param("nm") String nm, + @Param("publisher") String publisher, + @Param("note") String note, + Pageable pageable); + /** * 貸出フラグを from → to に更新する(現在値が from のときだけ更新)。 * 戻り値が0なら、既に他の操作で状態が変わっている(状態不整合)。 @@ -37,3 +40,42 @@ public interface BookCollectionRepository extends JpaRepository { +// +// /** +// * 貸出可の蔵書を部分一致(AND)で検索する。 +// * 空文字の条件は「指定なし」。LIKE の特殊文字は呼び出し側で '!' を使ってエスケープ済み。 +// */ +// @Query("select b from BookCollection b " +// + "where b.flgLending = :lending " +// + "and (:nm = '' or b.nmBook like concat('%', :nm, '%') escape '!') " +// + "and (:publisher = '' or b.publisher like concat('%', :publisher, '%') escape '!') " +// + "and (:note = '' or b.note like concat('%', :note, '%') escape '!') " +// + "order by b.idBook") +// List search(@Param("lending") String lending, +// @Param("nm") String nm, +// @Param("publisher") String publisher, +// @Param("note") String note); +// +// /** +// * 貸出フラグを from → to に更新する(現在値が from のときだけ更新)。 +// * 戻り値が0なら、既に他の操作で状態が変わっている(状態不整合)。 +// */ +// @Modifying(clearAutomatically = true, flushAutomatically = true) +// @Query("update BookCollection b set b.flgLending = :to, b.idUpdate = :uid, b.dateUpdate = :now " +// + "where b.idBook = :id and b.flgLending = :from") +// int updateLending(@Param("id") Integer id, @Param("from") String from, @Param("to") String to, +// @Param("uid") Integer uid, @Param("now") LocalDateTime now); +//} diff --git a/book-rent/src/main/java/com/example/demo/service/BookService.java b/book-rent/src/main/java/com/example/demo/service/BookService.java index b54cba4..2ff0c11 100644 --- a/book-rent/src/main/java/com/example/demo/service/BookService.java +++ b/book-rent/src/main/java/com/example/demo/service/BookService.java @@ -1,33 +1,67 @@ package com.example.demo.service; - -import java.util.List; - + +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.example.demo.common.Const; import com.example.demo.entity.BookCollection; import com.example.demo.repository.BookCollectionRepository; - + /** BOOK-01:書籍検索 */ @Service public class BookService { private final BookCollectionRepository bookRepository; - + public BookService(BookCollectionRepository bookRepository) { this.bookRepository = bookRepository; } - + /** 貸出可の蔵書を検索する。全て未入力なら全件。 */ @Transactional(readOnly = true) - public List searchLendable(String nmBook, String publisher, String note) { - return bookRepository.search(Const.LENDING_OK, normalize(nmBook), normalize(publisher), normalize(note)); + public Page searchLendable(String nmBook, String publisher, String note,int page, int size) { + return bookRepository.search(Const.LENDING_OK, normalize(nmBook), normalize(publisher), normalize(note),PageRequest.of(page, size)); } - + /** 前後の空白除去+LIKE特殊文字(! % _)のエスケープ(エスケープ文字は '!') */ static String normalize(String s) { if (s == null) return ""; return s.trim().replace("!", "!!").replace("%", "!%").replace("_", "!_"); } + + } - +//package com.example.demo.service; +// +//import java.util.List; +// +//import org.springframework.stereotype.Service; +//import org.springframework.transaction.annotation.Transactional; +// +//import com.example.demo.common.Const; +//import com.example.demo.entity.BookCollection; +//import com.example.demo.repository.BookCollectionRepository; +// +///** BOOK-01:書籍検索 */ +//@Service +//public class BookService { +// private final BookCollectionRepository bookRepository; +// +// public BookService(BookCollectionRepository bookRepository) { +// this.bookRepository = bookRepository; +// } +// +// /** 貸出可の蔵書を検索する。全て未入力なら全件。 */ +// @Transactional(readOnly = true) +// public List searchLendable(String nmBook, String publisher, String note) { +// return bookRepository.search(Const.LENDING_OK, normalize(nmBook), normalize(publisher), normalize(note)); +// } +// +// /** 前後の空白除去+LIKE特殊文字(! % _)のエスケープ(エスケープ文字は '!') */ +// static String normalize(String s) { +// if (s == null) return ""; +// return s.trim().replace("!", "!!").replace("%", "!%").replace("_", "!_"); +// } +//} +// diff --git a/book-rent/src/main/resources/static/css/style.css b/book-rent/src/main/resources/static/css/style.css index 056edc5..6a1a62f 100644 --- a/book-rent/src/main/resources/static/css/style.css +++ b/book-rent/src/main/resources/static/css/style.css @@ -110,4 +110,20 @@ th { background: #eaf4f6; } input[type=text], input[type=password], input[type=email] { max-width: 100% !important; } +} +/* ページネーション */ +.page-number { + display: inline-block; + background: #eaf4f6; + color: #176a78; + border: 1px solid #d4e3e6; + border-radius: 4px; + padding: 7px 12px; + margin: 2px; + text-decoration: none; + font-size: 14px; +} + +.page-number:hover { + background: #d5edf1; } \ No newline at end of file diff --git a/book-rent/src/main/resources/templates/bookList.html b/book-rent/src/main/resources/templates/bookList.html index 0193cfc..42ad7d3 100644 --- a/book-rent/src/main/resources/templates/bookList.html +++ b/book-rent/src/main/resources/templates/bookList.html @@ -1,12 +1,12 @@ - + 書籍一覧 - +
@@ -26,11 +26,11 @@

- +

検索結果

-

該当する書籍はありません。

- +

該当する書籍はありません。

+
@@ -60,8 +60,88 @@
蔵書ID
+ 前へ + + + + 次へ +
+ + + + + - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file