Es fiel mir schwer, Nachschlagewerke wie INNER JOIN und LEFT JOIN mit Spring zu lesen, daher werde ich sie als Memorandum schreiben.
Der Raumname und der Gerätename werden auf dem Bildschirm ausgegeben.
Spaltenname | Datentyp | |
---|---|---|
Zimmernummer | room_id | INT |
Raumname | room_name | VARCHAR |
Spaltenname | Datentyp | |
---|---|---|
Gerätenummer | equipmentId_id | INT |
Ausrüstungsname | equipment_name | VARCHAR |
Zimmernummer | room_id | INT |
Erstellen Sie eine Entität (Raum und Ausrüstung). Import entfällt.
Room.java
@Entity
public class Room implements Serializable {
@Id
@GeneratedValue
private Integer roomId;
private String roomName;
@OneToMany(mappedBy="room", cascade=CascadeType.ALL)
private List<Equipment> equipments;
public Integer getRoomId() {
return roomId;
}
public void setRoomId(Integer roomId) {
this.roomId = roomId;
}
public String getRoomName() {
return roomName;
}
public void setRoomName(String roomName) {
this.roomName = roomName;
}
public List<Equipment> getEquipments() {
return equipments;
}
public void setEquipments(List<Equipment> equipments) {
this.equipments = equipments;
}
}
Verwenden Sie @OneToMany, da eine Eins-zu-Viele-Beziehung zu Geräten besteht.
@OneToMany(mappedBy="room", cascade=CascadeType.ALL)
private List<Equipment> equipments;
Equipment.java
@Entity public class Equipment implements Serializable {
@Id
@GeneratedValue
private Integer equipmentId;
private String equipmentName;
@ManyToOne
@JoinColumn(name="room_id")
private Room room;
public Integer getEquipmentId() {
return equipmentId;
}
public void setEquipmentId(Integer equipmentId) {
this.equipmentId = equipmentId;
}
public String getEquipmentName() {
return equipmentName;
}
public void setEquipmentName(String equipmentName) {
this.equipmentName = equipmentName;
}
public Room getRoom() {
return room;
}
public void setRoom(Room room) {
this.room = room;
}
}
Verwenden Sie @ManyToOne, da mit Room eine Eins-zu-Eins-Beziehung besteht. Verwenden Sie room_id in @JoinColumn als externen Schlüssel.
@ManyToOne
@JoinColumn(name="room_id")
private Room room;
Erstellen Sie eine Abfrage mit @Query im Repository. Sie können den Wert dynamisch mit @Param ("roomId") festlegen.
EquipmentRepository.java
public interface EquipmentRepository extends JpaRepository<Equipment, Integer> {
@Query("SELECT DISTINCT e FROM Equipment e INNER JOIN e.room WHERE e.room.roomId = :roomId ORDER BY e.equipmentId")
List<Equipment> find(@Param("roomId") Integer roomId);
}
Inject Equipment Repository mit @Autowired. Eine Anmerkung, um den Wert der Pfadvariablen in der URL mit @PathVariable ("id") abzurufen.
TestController.java
@Controller
public class TestController {
@Autowired
EquipmentRepository equipmentRepository;
@GetMapping("/{id}")
public String index(@PathVariable("id")Integer id, Model model) {
List<Equipment> list2 =equipmentRepository.find(id);
model.addAttribute("lists2", list2);
return "index";
}
}
Geben Sie HTML-Elemente wiederholt für die Anzahl der durch th: each angegebenen Array-Werte aus.
index.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<table>
<tr>
<th>Zimmer</th>
<th>Ausrüstung</th>
</tr>
<tr th:each="list2:${lists2}">
<td th:text="${list2.room.roomName}">
<td th:text="${list2.equipmentName}">
</tr>
</table>
</body>
</html>
Mit dem oben genannten können der Raumname und der Gerätename ausgegeben werden. In Zukunft möchte ich die Anzahl der Tabellen erhöhen und die komplizierte Verarbeitung in Frage stellen.
Recommended Posts