src/main/resources/schema.sql
DROP TABLE IF EXISTS meeting_room CASCADE; DROP TABLE IF EXISTS reservable_room CASCADE; DROP TABLE IF EXISTS reservation CASCADE; DROP TABLE IF EXISTS usr CASCADE; CREATE TABLE IF NOT EXIST meeting_room( room_id SERIAL NOT NULL, room_name VARCHAR(255) NOT NULL, PRIMARY KEY (room_id) ); CREATE TABLE IF NOT EXIST reservable_room( reserved_data DATE NOT NULL, room_id INT4 NOT NULL, PRIMARY KEY(reserved_date, room_id) ); CREATE TABLE IF NOT EXIST meeting_room( reservation_id SERIAL NOT NULL, end_tim TIME NOT NULL, start_time TIME NOT NULL, reserved_date DATE NOT NULL, room_id INT4 NOT NULL, user_id VARCHAR(255) NOT NULL, PRIMARY KEY(reservation_id) ); CREATE TABLE IF NOT EXIST meeting_room( user_id VARCHAR(255) NOT NULL, first_name VARCHAR(255) NOT NULL, last_name VARCHAR(255) NOT NULL, password VARCHAR(255) NOT NULL, role_name VARCHAR(255) NOT NULL, PRIMARY KEY (user_id) );
repository class
package mrs.domain.repository.room; import java.time.LocalDate; import java.util.List; import mrs.domain.model.ReservableRoom; import mrs.domain.model.ReservableRoomId; import org.springframework.data.jpa.repository.JpaRepository; public interface ReservableRoomRepository extends JpaRepository<ReservableRoom, ReservableRoomId>{ List<ReservableRoom> findByReservableRoom_reservedDateOrderByReservableRoomId_roomIdAsc(LocalDate reservedDate); }
-> importで先ほど作ったmodelを読み込んでますね。なるほど、少しわかってきた。
domain/service/RoomService.java
package mrs.domain.repository.room; import java.time.LocalDate; import java.util.List; import mrs.domain.model.ReservableRoom; import mrs.domain.repository.room.ReservableRoomRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service @Transactional public class RoomService { @Autowired ReservableRoomRepository reservableRoomRepository; public List<ReservableRoom> findReservableRooms(LocalDate date){ return reservableRoomRepository.findByReservableRoomId_reservedDateOrderByReservableRoomId_roomIdAsc(date); } }
app/room/RoomsController.java
package mrs.app.room; import java.time.LocalDate; import java.util.List; import mrs.domain.model.ReservableRoom; import mrs.domain.service.room.RoomService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @Controller @RequestMapping("rooms") public class RoomsController { @Autowired RoomService roomService; @RequestMapping(method = RequestMethod.GET) String listRooms(Model model) LocalDate today = LocalDate.now(); List<ReservableRoom> rooms = roomService.findReservableRooms(today); model.addAttribute("date", today); model.addAttribute("rooms", rooms); return "room/listRooms"; }
-> ん? ControllerのRequestMappingでクエリ検索してる?
/main/resources/templates/room/listRooms.html
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"/> <title th:text="|${#temporals.format(date, 'yyyy/M/d')}の会議室|">2021/01/29の会議室</title> </head> <body> <h3>会議室</h3> <a th:href="@{'/rooms/' + ${date.minusDays(1)}}">< 前日</a> <span th:text="|${#temporals.format(date, 'yyyy/M/d')}の会議室|">2021/01/29の会議室</span> <a th:href="@{'/rooms/' + ${date.plusDays(1)}}">翌日 ></a> <ul> <li th:each="room: ${rooms}"> <a th:href="@{'/reservations/' + ${date}+ '/' + ${room.meetingRoom.roomId}}" th:text="${room.meetingRoom.roomName}"></a> </li> </ul> </body> </html>
-> thymeleafはthで変数入れてますね。th:eachはforeachっぽい。
RoomsController
String listRooms(@DateTimeFormat(iso = DateTimeFormat.ISO.DATE) @PathVariable("date") LocalDate date, Model model)
規約が多い印象だが、想像してたより複雑ではなさそう。。