#java #spring #spring-boot #mapping #spring-rest
#java #spring #весенняя загрузка #сопоставление #spring-rest
Вопрос:
У меня есть эта точка rest, которая используется для возврата идентификаторов:
@GetMapping("{id}")
public ResponseEntity<?> get(@PathVariable String id) {
return contractService
.findById(Integer.parseInt(id))
.map(mapper::toNewDTO)
.map(ResponseEntity::ok)
.orElseGet(() -> notFound().build());
}
DTO:
public class ContractNewDTO {
.....
private Integer terminal_id;
....
}
Как я могу перевести terminal_id в имя терминала, используя второй SQL-запрос?
Мне нужно что-то вроде этого:
……map(mapper::toNewDTO) -> получить здесь terminal_id и выполнить другой SQL-запрос, чтобы определить, какое имя относится к этому terminal_id, и вернуть имя терминала, А НЕ terminal_id.
Можете ли вы дать мне несколько советов, как это сделать?
Комментарии:
1. Что вы на самом деле хотите вернуть вызывающему? DTO с идентификатором и именем? Разве ваш mapper не может также извлечь имя из объекта, возвращаемого contractService?
2. Я хочу вернуть ему DTO с именем. Нет, мне нужно выполнить второй запрос.
Ответ №1:
Итак, вы хотите получить terminal_name на основе terminal_id. У вас есть несколько вариантов:
1) Если terminal_name
он находится в той же таблице базы данных, что и temrminal_id
, то он должен быть загружен внутрь, ContractNewDTO
в вашем mapper::toNewDTO
вы можете реализовать логику преобразования, которая использует terminal_name
вместо temrminal_id
.
2) Если termminal_name
он находится в другой таблице (например, в таблице terminaldetails) и вам понадобятся все данные из этой таблицы, тогда вы можете создать сопоставление (например, OneToOne, присоединенный к terminal_id
). Вот отличная статья о том, как выполнить отображение OneToOne, от самого мастера.
3) Другой вариант — использовать @SecondaryTable . Допустим, вашей текущей сущностью является TerminalEntity, и она имеет столбец terminal_id
и сопоставлена с таблицей «terminal». terminal_name
Находится в другой таблице «terminaldetails».
Что вы можете сделать, так это:
@Entity
@Table(name = "terminal")
@SecondaryTable(name = "terminaldetails")
public class TerminalEntity {
@Id
@GeneratedValue
private Long id;
@Column(name = "terminal_id")
private String terminalId;
@Column(name = "terminal_name", table = "terminaldetails")
private String terminalName;
}
Комментарии:
1. Я решил проблему, используя второй SQL-запрос. Возможно, это самый примитивный и базовый способ, но у меня есть фиксированное время загрузки страницы таблицы.