Spring Data Jdbc 是否启用连接外键而不是 ID?

Does Spring Data Jdbc enables join foreign key rather than id's?

尝试了很多选项,但我的连接总是错误。而不是通过在 supplier_contracts 'status' 列中填充的 id 获取实际的 status_name table 存储库 returns 加入 2 [=26] 的 i'ds =]秒。那么我如何通过状态列 supplierContractRepository.findById(3L)?

的 int 检索 status_name

状态实体

 CREATE TABLE `contract_statuses` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(45) NOT NULL,
  PRIMARY KEY (`id`)
);

public class ContractStatuses {
  
    @Id
    Integer id;
    String name;

    public ContractStatuses(int id, String name) {
        this.id = id;
        this.name = name;
    }
} 

合同实体

    CREATE TABLE `suppliers_contracts` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT,
      `supplier` bigint(20) NOT NULL,
      `cabs_id` int(11) DEFAULT NULL,
      `start_date` date DEFAULT NULL,
      `end_date` date DEFAULT NULL,
      `attorny_end_date` date DEFAULT NULL,
      `number_of_payments` int(11) DEFAULT NULL,
      `payment_amount` int(11) DEFAULT NULL,
      `comments` varchar(2000) DEFAULT NULL,
      `close_date` timestamp NULL DEFAULT NULL,
      `status` int(11) NOT NULL,
      `created_on` timestamp NOT NULL DEFAULT current_timestamp(),
      PRIMARY KEY (`id`)
    );

@Table("suppliers_contracts")
public class SupplierContract {
    @Id
    Long id;
    Long supplier;
    Long cabsId;
    Date startDate;
    Date endDate;
    int paymentAmount;
    Date attornyEndDate;
    int numberOfPayments;
    String comments;
    Date closeDate;
    @MappedCollection(idColumn = "id")
    ContractStatuses status;
   
    public SupplierContract(Long id, Long supplier, Long cabsId, Date startDate, Date endDate,Date attornyEndDate, int numberOfPayments, int paymentAmount,
                            String comments, Date closeDate,ContractStatuses status) {
        this.id = id;
        this.supplier = supplier;
        this.cabsId = cabsId;
        this.startDate = startDate;
        this.endDate = endDate;
        this.attornyEndDate = attornyEndDate;
        this.numberOfPayments = numberOfPayments;
        this.paymentAmount = paymentAmount;
        this.comments = comments;
        this.closeDate = closeDate;
        this.status = status;

    }
}
        //Getters and setters here

@GetMapping("/getContracts")
    public Optional<SupplierContract> getSupp(){
       Optional<SupplierContract>  contract = supplierContractRepository.findById(3L);
        return contract ;
    }

您应该在 SupplierContractContractStatuses class 之间使用 DB 关系。

即使用 ContractStatuses contractStatuses; 而不是 int status; 并在此之后使用关系 one-to-many 当您查询 findAll() 时,您将从那里得到 ContractStatuses status_name.

您有多种选择:

  1. 默认变体是通过单独调用单独的 ContractStatusRepository 来加载状态。由于这些状态可能不会经常更改,您可以考虑为此进行缓存。

  2. 如果您只想要状态而不关心合同,您可以使用 @Query 注释向您的存储库添加一个额外的方法,该注释选择基于状态的两个字段在使用 SQL 连接的合同的 id 上。

  3. 这个只适用于只读访问! 您可以创建另一个包含 ContractStatuses 引用的实体 ReadOnlyContract,标记为嵌入属性。您现在可以将其映射到包含其他状态字段的视图。 为了避免意外使用写入方法,您应该让存储库继承自 Repository 并仅添加您实际需要的读取方法。