From f7020dd41ada692565daa68b4020bd6fc70c913d Mon Sep 17 00:00:00 2001
From: "h.hein" <26-h-kyaw-sakuracommunication@it-college.co.jp>
Date: Tue, 27 Oct 2026 14:33:13 +0900
Subject: [PATCH] =?UTF-8?q?=E5=B0=8F=E6=BE=A4=E3=81=95=E3=82=93=E3=81=AE?=
=?UTF-8?q?=E4=BD=9C=E6=88=90?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../demo/controller/BookController.java | 73 ++++++++++++---
.../repository/BookCollectionRepository.java | 60 ++++++++++--
.../com/example/demo/service/BookService.java | 54 +++++++++--
.../src/main/resources/static/css/style.css | 16 ++++
.../main/resources/templates/bookList.html | 92 +++++++++++++++++--
5 files changed, 259 insertions(+), 36 deletions(-)
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 @@
-
+
検索結果
-
該当する書籍はありません。
-
+ 該当する書籍はありません。
+
+ 前へ
+
+
+
+ 次へ
+
+
+
+
+
+
-