Преобразование идентификатора из запроса в строку

#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-запрос. Возможно, это самый примитивный и базовый способ, но у меня есть фиксированное время загрузки страницы таблицы.