【问题标题】:Convert ID from query to String将 ID 从查询转换为字符串
【发布时间】:2023-03-10 14:05:01
【问题描述】:

我有这个用于返回 ID 的休息点:

@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;
    ....
}

如何使用第二个 SQL 查询将 terminal_id 转换为终端名称?

我需要这样的东西:

......map(mapper::toNewDTO) -> 获取终端 ID 并进行另一个 SQL 查询以查找与此终端 ID 相关的名称并返回终端名称而不是终端 ID。

你能给我一些建议吗?

【问题讨论】:

  • 你真正想向调用者返回什么?带有 id 和名称的 DTO?你的映射器不能也从contractService返回的实体中提取名称吗?
  • 我想用这个名字返回他的 DTO。不,我需要进行第二次查询。

标签: java spring spring-boot mapping spring-rest


【解决方案1】:

所以您想根据终端 ID 检索终端名称。 您有两种选择:

1) 如果terminal_nametemrminal_id 在同一个数据库表中,那么它应该在mapper::toNewDTO 中的ContractNewDTO 中加载,您可以实现使用terminal_name 而不是temrminal_id 的转换逻辑.

2) 如果termminal_name 在另一个表中(例如,terminaldetails 表),并且您需要该表中的所有数据,那么您可以创建一个映射(例如,在terminal_id 上加入 OneToOne)。 Here 是一篇关于如何进行 OneToOne 映射的优秀文章,来自大师本人。

3) 另一种选择是使用@SecondaryTable。假设您当前的实体是 TerminalEntity,它具有列 terminal_id 并映射到表“终端”。 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;
}

【讨论】:

  • 我通过使用第二个 SQL 查询解决了这个问题。可能是最原始最基本的方式,但是我有一个固定的时间加载表格页面。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多