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 ;
}
您应该在 SupplierContract
和 ContractStatuses
class 之间使用 DB 关系。
即使用 ContractStatuses contractStatuses;
而不是 int status;
并在此之后使用关系 one-to-many 当您查询 findAll()
时,您将从那里得到 ContractStatuses
status_name
.
您有多种选择:
默认变体是通过单独调用单独的 ContractStatusRepository
来加载状态。由于这些状态可能不会经常更改,您可以考虑为此进行缓存。
如果您只想要状态而不关心合同,您可以使用 @Query
注释向您的存储库添加一个额外的方法,该注释选择基于状态的两个字段在使用 SQL 连接的合同的 id
上。
这个只适用于只读访问!
您可以创建另一个包含 ContractStatuses
引用的实体 ReadOnlyContract
,标记为嵌入属性。您现在可以将其映射到包含其他状态字段的视图。
为了避免意外使用写入方法,您应该让存储库继承自 Repository
并仅添加您实际需要的读取方法。
尝试了很多选项,但我的连接总是错误。而不是通过在 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 ;
}
您应该在 SupplierContract
和 ContractStatuses
class 之间使用 DB 关系。
即使用 ContractStatuses contractStatuses;
而不是 int status;
并在此之后使用关系 one-to-many 当您查询 findAll()
时,您将从那里得到 ContractStatuses
status_name
.
您有多种选择:
默认变体是通过单独调用单独的
ContractStatusRepository
来加载状态。由于这些状态可能不会经常更改,您可以考虑为此进行缓存。如果您只想要状态而不关心合同,您可以使用
@Query
注释向您的存储库添加一个额外的方法,该注释选择基于状态的两个字段在使用 SQL 连接的合同的id
上。这个只适用于只读访问! 您可以创建另一个包含
ContractStatuses
引用的实体ReadOnlyContract
,标记为嵌入属性。您现在可以将其映射到包含其他状态字段的视图。 为了避免意外使用写入方法,您应该让存储库继承自Repository
并仅添加您实际需要的读取方法。